2015-05-13 130 views
1

我試圖瞭解preg_replace_callback函數。在我的回調中,我得到了匹配的字符串兩次,而不是一次出現在主題字符串中。你可以將go here and copy/paste this code加入到測試程序中,並且當我期望的時候它會返回兩個值。preg_replace_callback返回重複值

preg_replace_callback(
    '"\b(http(s)?://\S+)"', 
    function($match){   
     var_dump($match); 
     die(); 
    }, 
    'http://a' 
); 

輸出看起來像這樣:

array(2) { [0]=> string(8) "http://a" [1]=> string(8) "http://a" } 

documentation mentions返回一個數組如果受試者是一個數組,或字符串否則。發生了什麼?

回答

3

你有一個完整的模式匹配\b(http(s)?://\S+)$match[0]$match[1]加括號捕獲組(http(s)?://\S+)匹配。

在這種情況下,只需使用$match[0]類似:

$result = preg_replace_callback(
    '"\b(http(s)?://\S+)"', 
    function($match){   
     return $match[0] . '/something.php'; 
    }, 
    'http://a' 
); 

替換http://ahttp://a/something.php

+0

爲什麼's'不是以加括號的捕獲組的形式返回的? – smilebomb

+0

你的主題字符串不是's',而你有一個'?'使得該組可選。如果將括號內的「?」移動,該組將始終存在,但根據其是否存在而爲空或「s」。 –

+0

哦,我在這裏交換我自己的代碼和示例代碼。我的錯。 – smilebomb