2013-09-25 90 views
0

鑑於字符串{{esc}}"Content"{{/esc}} ... {{esc}}"More content"{{/esc}}我想輸出\"Content\" ... \"More content\"例如,我試圖逃避字符串中的引號。 (這是一個人爲的例子,不過,這樣的東西,如「只是使用這個庫做」的答案將是無益的。)preg_replace_callback正則表達式問題,與(。*?)匹配返回數組

這是我目前的解決方案:

return preg_replace_callback(
    '/{{esc}}(.*?){{\/esc}}/', 
    function($m) { 
    return str_replace('"', '\\"', $m[1]); 
    }, 
    $text 
); 

正如你所看到的,我需要說$m[1],因爲print_r表明$m看起來是這樣的:

Array 
(
    [0] => {{esc}}"Content"{{/esc}} 
    [1] => "Content" 
) 

,或者對於第二場比賽,

Array 
(
    [0] => {{esc}}"More content"{{/esc}} 
    [1] => "More content" 
) 

我的問題是:爲什麼我的正則表達式會導致$m成爲一個數組?有沒有什麼辦法可以將$m[1]的結果看作是一個變量$m

+0

這是記錄的行爲,所以第二個問題的答案是「否」。 –

+0

呃,它在[manual](http://php.net/preg_replace_callback)? –

+0

唉,我沒看到有關「括號內的子表達式」的內容。謝謝! –

回答

0

與傑克的幫助下,我在這裏回答了我的問題,因爲過度用沒有清楚這一點:數組的第二個元素是由括號捕獲的結果子表達式(.*?),根據PHP manual.的確,似乎沒有一種方便的方式來提取由該子表達式匹配的字符串。

0

正則表達式匹配字符串並將結果放入數組中。如果匹配,則第一個索引存儲整個匹配字符串,數組的其餘元素是捕獲的字符串。

preg_replace_callback()的作用就像preg_match()

$result = array(); 
preg_match('/{{esc}}(.*?){{\/esc}}/', $input_str, $result); 

// $result will be an array if match.