Php 我的preg_匹配,或get_file_内容是否使我的页面变慢?
我的网站目前使用一个模板系统,它加载Php 我的preg_匹配,或get_file_内容是否使我的页面变慢?,php,regex,Php,Regex,我的网站目前使用一个模板系统,它加载.tpl文件列表,用正确的内容替换{bounder},并将其输出到页面上 我需要得到所有模板中所有手镯的列表,这样我就可以阻止PHP运行特定于手镯的代码,这将有助于减少查询量 目前我的页面加载时间为1.09秒,如果我添加以下代码,页面加载时间将增加到1.53秒 我想这是因为我将大约100个文件加载到内存中,然后进行preg\u match\u all并将它们全部推到一个数组中 bracelets = []; foreach($files as $file)
.tpl
文件列表,用正确的内容替换{bounder}
,并将其输出到页面上
我需要得到所有模板中所有手镯的列表,这样我就可以阻止PHP运行特定于手镯的代码,这将有助于减少查询量
目前我的页面加载时间为1.09秒,如果我添加以下代码,页面加载时间将增加到1.53秒
我想这是因为我将大约100个文件加载到内存中,然后进行preg\u match\u all
并将它们全部推到一个数组中
bracelets = [];
foreach($files as $file) {
if (empty($file)) continue;
$html = get_file_contents($file);
$matches = [];
preg_match_all("/{(.*?)\}/", $html, $matches);
bracelets = (array_merge($bracelets, $matches[1]));
}
bracelets = array_unique(bracelets);
导致速度下降的代码位是什么?处理长度未知的文件时,基于延迟点的模式可能会降低性能。如果分隔符之间出现大块文本,这里是大括号,因为
{.*?}
是这样工作的:{
匹配,然后跳过*?
并搜索}
。如果不存在,*?
用于匹配{
之后的字符,并测试下一个字符的}
。在找到}
之前,如果存在除}
以外的字符,则此过程重复的次数相同。这意味着引擎仍然要花费太多的时间来获取结束分隔符
当使用[^}]
求反字符类时,您可以使用贪婪的*
或+
量词,因为您不再需要单独测试所有字符,引擎贪婪地一次抓取除
以外的所有1/0或更多字符,并找到
(如果有)\
因为您需要匹配像{bounder}
这样的值,并避免返回像{brace let}
这样的条目,所以当前的正则表达式不仅速度慢,而且是错误的
换成
"/{([^{}\s]+)}/"
[^{}\s]+
部分匹配除{
、}
和空格以外的一个或多个字符
至于保持唯一值的串联数组,请参见。关于
“/{([^{}]+)}/”
??@WiktorStribiżew不确定正则表达式将如何改变速度?当惰性点模式必须匹配大量数据时,它仍然是一个regex?PCRE性能通常会下降。而贪婪的+
否定字符类不会遇到这个问题。@WiktorStribiżew-Ah-gotcha,似乎没有多大的提速作用,但现在JavaScript正在返回,有没有一种方法可以忽略包含空格的匹配?啊哈,所以你只想匹配{bounder}
,而不想返回{brake let}
?使用“/{([^{}\s]+)}/”
感谢您的帮助,我们将使用不同的方法禁用代码,但这很有帮助。