包装preg_replace单独重复组

时间:2016-03-11 17:42:08

标签: php regex

我在PHP中有一个简单的正则表达式,我用它来代替字符串。

$pat='/\$(\w+)/';
$repl='f("${1}")';
echo preg_replace($pat,$repl,'This is a $test.');

例如,这可以翻译:

This is a $test.

成:

This is a f("test")

但是现在我想稍微改变这一点,以便我可以匹配多个逗号分隔的单词并单独包装它们,如下所示:

This is a $test,red,green,blue.

应该成为:

This is a f("test","red","green","blue")

我可以轻松地提出这个模式:

$pat='/\$([\w,]+)/';

但我不知道如何单独包装重复组的每个元素。使用现有的替代品我得到:

This is a f("test,red,green,blue")

尝试类似:

$repl='f(${"1"})';

破坏了参考资料,显然无法正常工作。

1 个答案:

答案 0 :(得分:2)

要执行此操作,您必须使用preg_replace_callback(),然后使用回调函数稍微修改您的替换,您首先将逗号分隔的explode()匹配为数组,然后implode()回到一个字符串,您可以在其中放置引号,例如

的更换:

$repl = function($m){
    return 'f("' . implode("\",\"", explode(",", $m[1])) . '")';
};

函数调用:

preg_replace($pat, $repl, $str); → preg_replace_callback($pat, $repl, $str);