1

我正在使用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);

想法是将 [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>';

现在我知道原因了,我理解了正则表达式,但我想不出解决方案,如果有人知道如何使它工作,我将非常感激,谢谢大家,祝你有美好的一天。

4

2 回答 2

3

你的问题是贪婪匹配:

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

应该按照您的意愿行事。

Regex Repetition 是贪婪的,这意味着它会捕获尽可能多的匹配项,然后如果发现无法匹配重复后剩下的内容,则一次放弃一个匹配项。通过使用问号,您表示您想要非贪婪或惰性匹配,这意味着引擎将首先尝试匹配正则表达式的其余部分,然后增加重复的大小。

于 2013-10-18T19:02:42.257 回答
2

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

$pattern = '~\[code]\s*+((?>[^[\s]++|\s*+(?!\[/code])\[?+)*+)\s*+\[/code]~i';
$replacement = '<div>$1</div>';
$result = preg_replace($pattern, $replacement, $result);
于 2013-10-18T19:53:01.487 回答