【发布时间】:2017-12-12 21:00:23
【问题描述】:
我正在尝试优化 PHP 正则表达式,并正在向优秀的 Stack Overflow 社区寻求指导。
我正在尝试在 HTML 块中捕获预定义的匹配项,例如:
##test##
##!test2##
##test3|id=5##
将运行的示例文本是:
Lorem ipsum dolor sit amet,##test## consectetur adipiscing elit。 Pellentesque id congue massa。 Curabitur ##test3|id=5## egestas ullamcorper sollicitudin。 Mauris venenatis sed metus vitae pharetra。
到目前为止,我有两个选择。从优化的角度考虑哪个最好?
选项 1
~##(!?)(test|test2|test3)(|\S+?)##~s
选项 2
~\##(\S+)##~s
对于示例\##!test2## 中的"!",它旨在标记项目在处理时的特殊行为。这可以移动到像##test3|force=true&id=5## 这样的属性。如果是这样的话,那就是:
选项 3
~##(test|test2|test3)(|\S+?)##~s
我们关注的最大因素是性能和优化。
提前感谢您的帮助和洞察力!
【问题讨论】:
-
but how to benchmark and understand which is best?运行它们并查看内存使用情况和运行代码的时间。 -
我同意 Andreas,唯一的方法是进行大规模测试 (10000+) 并测量和比较您的结果
-
前面的 cmets 是正确的,但是您遗漏了其他主要问题。您需要转义管道符号 (
|),如(\|?)。您不需要转义井号 (#)。此外,您的参数对于正则表达式应该匹配的内容并不完全清楚。但是对于您正在尝试做的事情,最简单和可能最快的正则表达式可能看起来像这样:~##[^\s#]+?##~s。 -
尽可能避免交替,因为引擎必须进入每个分支才能找到令人满意的路径。最好的情况是通过第一面。更少的模式通常意味着更高的效率。根据需要应用修饰符。
s会影响您甚至没有使用过的.。尽可能贪婪。引擎喜欢它。~##[^#]*##~
标签: php regex optimization