【发布时间】:2014-07-02 04:55:09
【问题描述】:
这是正则表达式:
([A-Z]+(?:(?:[\w\d@#$%&;,\+\.\*!-]+)?\s?(?![a-z&;]+\s)){1,})\s(<span class="label label-inverse">.*?</span>)
这将匹配如下字符串:
<p>Buy Apple <span class="label label-inverse">AAPL - NYSE</span> at or under $100 per share.</p>
在 regexpal 等 javascript 正则表达式测试器中进行测试时,它按预期工作。但是,PHP preg_replace 函数返回 null 并出现错误 PREG_BACKTRACK_LIMIT_ERROR。
$string = preg_replace('~([A-Z]+(?:(?:[\w\d@#%&!;,\+\.\*\$-]+)?\s?(?![a-z&;]+\s)){1,})\s(<span class="label label-inverse">.*?</span>)~i', '<strong>$1</strong> $2', $string);
这是为什么?谁能解释一下 PHP 中的正则表达式有什么问题以及如何纠正它以使其像在 javascript 中一样运行?
【问题讨论】:
-
在 PHP 中,您是否针对较大的文档对其进行测试?
-
顺便说一句,你是怎么想出这种可怕的表达方式的?你想精确匹配什么?
-
我在 JS 和 PHP 中针对相同的 HTML 对其进行了测试。如果可以优化正则表达式,我会全神贯注。它需要匹配大型 HTML 文档中的以下 HTML 字符串:
Apple <span class="label label-inverse">AAPL - NYSE</span>eBay <span class="label label-inverse">EBAY - NYSE</span>E*TRADE <span class="label label-inverse">ETFC - NYSE</span>