PHP preg_replace连续次数取决于匹配?

时间:2014-10-17 00:07:36

标签: php regex preg-replace preg-match preg-match-all

我在php字符串中有类似下面的字符串,我希望用[更改选项卡的次数]后面的值替换制表符字符)...]

[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 个答案:

答案 0 :(得分: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修饰符为每场比赛执行代码,这是非常危险的应该避免。

答案 1 :(得分:2)

您希望使用回调来实现此目的。

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

Code Demo