【发布时间】:2014-02-25 21:17:06
【问题描述】:
这个正则表达式应该匹配列表,就像在 Markdown 中一样:
/((?:(?:(?:^[\+\*\-] )(?:[^\r\n]+))(?:\r|\n?))+)/m
它在 Javascript 中工作(添加了g 标志),但我在将它移植到 PHP 时遇到了问题。它的行为不贪婪。这是我的示例代码:
$string = preg_replace_callback('`((?:(?:(?:^\* )(?:[^\r\n]+))(?:\r|\n?))+)`m', array(&$this, 'bullet_list'), $string);
function bullet_list($matches) { var_dump($matches) }
当我输入一个包含三行的列表时,它会显示:
array(2) { [0]=> string(6) "* one " [1]=> string(6) "* one " } array(2) { [0]=> string(6) "* two " [1]=> string(6) "* two " } array(2) { [0]=> string(8) "* three " [1]=> string(8) "* three " }
显然var_dump 被调用了 3 次,而不是像我期望的那样只调用一次,因为正则表达式是贪婪的,并且必须匹配尽可能多的行。我已经在 regex101.com 上对其进行了测试。
如何让它正常工作?
【问题讨论】:
-
那些反引号真的存在吗?
-
@TimPietzcker 反引号作为正则表达式修饰符
-
@Tim Pietzcker 已修复。当我不需要时使用反斜杠来逃避反引号
-
啊,我曾将反斜杠视为斜杠并感到困惑:)
-
您需要小心,因为您的匹配仅在文本以项目符号列表开头时才有效。它也只匹配一个列表。如果您想匹配所有列表,请参阅我的答案。
标签: php regex preg-replace-callback