Php,Regex preg_replace_callback

时间:2013-10-18 18:59:56

标签: php regex

我正在使用preg_replace_callback,这就是我要做的事情:

$result = '[code]some code here[/code]';

$result = preg_replace_callback('/\[code\](.*)\[\/code\]/is', function($matches){
      return '<div>'.trim($matches[1]).'</div>';
}, $result);

我们的想法是将{strong> [code]与<div> [/ code]的所有匹配替换为</div> ,并修改代码他们之间。

问题出在这个字符串上,例如:

$result = '[code]some code[/code]some text[code]some code[/code]';

我想要的结果是 2分开 div:

$result = '<div>some code</div>some text<div>some code</div>';

我得到的结果是:

$result = '<div>some code[code]some text[/code]some code</div>';

现在我知道原因,而且我理解正则表达式,但我无法提出解决方案,如果有人知道如何使它工作,我将非常感谢,谢谢大家,祝你有愉快的一天。

2 个答案:

答案 0 :(得分:3)

你的问题是贪婪的匹配:

/\[code\](.*?)\[\/code\]/is

应该按照您的意愿行事。

正则表达式重复是贪婪,这意味着它可以捕获尽可能多的匹配项,然后如果它发现它不能匹配什么,则一次放弃一个匹配项。重复后离开了。通过使用问号,您表示您想要非贪婪地匹配,或懒惰,这意味着引擎将尝试匹配正则表达式的其余部分FIRST,然后增加重复的大小后。

答案 1 :(得分:2)

您不需要使用preg_replace_callback(),因为您可以提取“trimed”内容:

$pattern = '~\[code]\s*+((?>[^[\s]++|\s*+(?!\[/code])\[?+)*+)\s*+\[/code]~i';
$replacement = '<div>$1</div>';
$result = preg_replace($pattern, $replacement, $result);