我正在使用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>';
现在我知道原因,而且我理解正则表达式,但我无法提出解决方案,如果有人知道如何使它工作,我将非常感谢,谢谢大家,祝你有愉快的一天。
答案 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);