【发布时间】:2016-05-06 22:41:04
【问题描述】:
我的模式:
/{LOOP:(\w+)[^}]*}((\s*?.?)*?){\/LOOP:\1}/
我的测试字符串:
<tbody>
{LOOP:MENU}
<tr>
<td>{VAR:ID}</td>
<td>{VAR:NAME}</td>
<td>{VAR:ROLLE}</td>
<td>{VAR:ACTIONS}</td>
</tr>
{/LOOP:MENU}
</tbody>
当您在 regex101 上尝试它时,它可以正常工作。但是当我使用preg_match_all() 在我的服务器上尝试它时,它不起作用。 preg_last_error() 返回:
2(PREG_BACKTRACK_LIMIT_ERROR)。
regex101 告诉我“581 步中的 1 场比赛”怎么可能?还是步数与Backtrack无关?
我正在使用 PHP 版本 5.5.9-1ubuntu4.16 的 apache2 服务器。
在我的 php.ini 中,pcre.backtrack_limit 设置为 1000000。
编辑:
按照 Alan Moore 的建议,我现在使用以下模式:
/{LOOP:(\w+)[^}]*}(.*?){\/LOOP:\1}/s
这会返回 0(NO_ERROR)。但在我的服务器上,它现在不匹配任何东西。为什么它可以在 regex101 上运行,但不能在我的服务器上运行?
PHP:
$test="<tbody>
{LOOP:MENU}
<tr>
<td>{VAR:ID}</td>
<td>{VAR:NAME}</td>
<td>{VAR:ROLLE}</td>
<td>{VAR:ACTIONS}</td>
</tr>
{/LOOP:MENU}
</tbody>"
preg_match_all("/{LOOP:(\w+)[^}]*}(.*?){\/LOOP:\1}/s", $test, $matches, PREG_SET_ORDER);
// $matches is now an emty array.
【问题讨论】:
-
((\s*?.?)*?)太复杂了。只需使用(.*?)并添加s修饰符。
标签: php regex preg-match-all pcre