2012-01-27 66 views
2

我有問題理解本之一:正則表達式示例

<?php 
$string = 'April 15, 2003'; 
$pattern = '/(\w+) (\d+), (\d+)/i'; 
$replacement = '${1}1,$3'; 
echo preg_replace($pattern, $replacement, $string); 
?> 

輸出是April1,2003。我不明白這個表達:$replacement = '${1}1,$3'; 如果有人爲我澄清它,我將不勝感激。

回答

2

程序員不得不使用它,因爲

$replacement = '$11,$3'; 

將採取行動怪異和錯。此外,他們也不能使用

$replacement = '$1'.'1,$3'; 

太,因爲它會導致它被解析爲第一個例子。

這就是爲什麼有這些括號,它們作爲變量和數字1之間的分隔符。

這是一樣

$username = "Martin" 
$text = "Hello ${username}and welcome"; 

上面的例子將輸出 「你好Martinand歡迎」

但是這一次

$username = "Martin"; 
$text = "Hello $usernameand welcome"; 

與純文本,這是mistchmashing變量名您的替代品,編號1

+0

不,這不是。你的模式在輸出中錯過了4月份。 – 2012-01-27 06:04:51

+0

@ daniel.tosaba:啊,很好。看看我的編輯 – 2012-01-27 06:11:10

1

The ${1}語法引用模式匹配中的第一個捕獲組。在這種情況下這是必要的,因爲替換的所需輸出是第一個捕獲組,然後是文字1

這是PHP如何在正則表達式上下文中處理反向引用的結果。必須使用${1}來將反向引用與文字1分開。如果模式是$11,php會認爲$11是第十一個捕獲組的參考。

1

這裏的問題是,您正在構造$replacement變量,並且在調用preg_replace之前發生所有字符串連接。就拿這個例子:

比方說,你有:

$replacement = '$1' . '1'; 

這是什麼會做的就是把價值$11到您的變量$更換時的preg_replace被調用時,它將試圖找到一個反向引用#11通過使用替換爲$11,顯然它不存在。

現在,如果你將其更改爲:

$replacement = '$1' . ' '; 

它將擁有價值$1和您的更換將正確正確'April '

關於使用大括號:大括號是用來明確指定一個變量名的末尾,因此這工作得很好:

$replacement = '${1}' . '1'; 

,並替換字符串'April1