2014-10-17 61 views
2

我有一個PHP字符串像下面的字符串,我想這取決於之後的價值標籤的字符替換[(出現時間片的數量))...]根據匹配情況,PHP preg_replace的連續次數是多少?

[4m ljjklj klj lkj lkjlj lk[] 
[3m ljjklj klj lkj lkjlj lk[] 
[m ljjklj klj lkj lkjlj ljk l 

我已經寫以下代碼

$string_log= preg_replace('/\[(.*?)m/',"\t",$string_log); 

它將替換爲一個製表符,但我需要根據字母m前面的數字替換它。

例如,如果字符串是

[4m] then it should be \t\t\t\t 
[m] then it should be \t 
[2m] then it should be \t\t 

如何與PHP的preg_replace實現這一目標?

回答

2

使用preg_replace_callback

$string_log = preg_replace_callback('/\[(.*?)m/', function ($match) { 
    if ($match[1]) $count = $match[1]; 
    else $count = 1; 
    return str_repeat("\t", $count); 
}, $string_log); 

如果必須使用純preg_replace,不能使用其他功能,那麼我認爲你將不得不使用/e修改爲每場比賽,這是非常執行代碼危險的,應該避免。

2

你想使用回調來實現這一點。

$str = preg_replace_callback('~\[(\d*)m~', 
    function($m) { 
     $count = $m[1] ?: 1; 
     return str_repeat("\t", $count); 
     }, $str); 

Code Demo

+2

今天我發現一個有趣的把戲,因爲PHP 5.3,你可以寫'$數= $ M [1]:1;' – 2014-10-17 00:31:57