PHP正则表达式无法正常工作 - 在本地服务器上返回NULL,但在其他服务器上正常工作

sim*_*mon 2 php regex

我有以下正则表达式:

/\{\s?joomla-tag\s+(.*<+.+>+.*)\s?\}/is
Run Code Online (Sandbox Code Playgroud)

和以下代码:

$regex = "/\{\s?joomla-tag\s+(.*<+.+>+.*)\s?\}/is";
$replace = '<div class="someclass">$1</div>';
$text = preg_replace( $regex, $replace, $text );
Run Code Online (Sandbox Code Playgroud)

但是,不幸的是,它无法匹配以下代码(尽管如此):

.... many html lines .......
<p>123{joomla-tag Lore<strong>m</strong> ip</p>
<p>sum dolor sit amet}</p>
.... many html lines .......
Run Code Online (Sandbox Code Playgroud)

请参阅真实示例: http ://pastebin.com/WSQyrmxd

怎么了:正则表达还是其他什么?你能告诉你正确的变体吗?在RegExr中,一切都很顺利,但不是在PHP中.

在本地服务器上,我只是在preg_replace之后得到NULL


编辑: 最后我找到了一个解决方案:(谢谢,sg3s,一个想法) http://www.pelagodesign.com/blog/2008/01/25/wtf-preg_replace-returns-null/

Ala*_*ore 5

你说你解决了这个问题,但如果你的解决方案是增加backtrack_limit设置,那不是解决方案.事实上,你可能会在以后为更大的问题做好准备.你需要找出为什么它做了这么多的回溯.

\{\s?joomla-tag\s+找到标签的开头之后,第一个.*开始吞噬文档的其余部分.然后它开始后退,试图让正则表达式的其余部分匹配.当它到达<+可以匹配的点时,.+再次消耗文档的其余部分,并开始另一波回溯..*在此之后的又一次,你正在做一些荒谬的不必要的工作.

这是经验法则的原因,

如果您可以使用更具体的东西,请不要使用点元字符(特别是.*.+).如果使用点,请不要在单行或DOTALL模式下使用它(即/s修饰符或其内联(?s)形式).

在这种情况下,您知道匹配应该在下一个右括号(})结束,所以在此之前不要让它匹配任何大括号:

\{\s?joomla-tag\s+([^}]*)\}
Run Code Online (Sandbox Code Playgroud)