Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我的preg_匹配,或get_file_内容是否使我的页面变慢?_Php_Regex - Fatal编程技术网

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]+)}/”
感谢您的帮助,我们将使用不同的方法禁用代码,但这很有帮助。