【发布时间】:2018-08-10 19:54:39
【问题描述】:
我正在使用此代码
preg_match_all("/([^#]+\btbds\b.+?)#/iu", $data, $matches);
查找所有名为 tbds 的单词,但执行模式搜索大约需要 1.20 秒。如果我只使用 tbds\b 而不是 \btbds\b 只需 0.19 秒(少 6 倍)。
preg_match_all("/([^#]+tbds\b.+?)#/iu", $data, $matches);
有什么方法可以优化单词匹配 \btbds\b 以花费大约 0.19 秒?我需要处理大量数据。
这里是测试代码:
function generateRandomString($length = 10) {
$characters = ' 0123 456 789 abcd efgh ijkl mn opqrstu vwx yzAB CDE FGHI JKL MNOP QRS TUVWX YZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
$randomString = preg_replace('/\s+/', ' ', $randomString);
return trim($randomString,' ');
}
$data=NULL;
for ($a = 1; $a < 1000000; $a++)
$data.=" ".generateRandomString(100)." #";
$t = microtime(true);
preg_match_all("/([^#]+\btbds\b.+?)#/iu", $data, $matches);
echo microtime(true) - $t; echo "\n";
【问题讨论】:
-
我需要处理大量数据。欢迎任何帮助:)
-
那么,你想对这么大量的数据做什么,为什么必须快速完成呢?如果我们知道您想要达到的目标,也许它可以激励我们帮助您?换句话说:我们如何优化我们一无所知的东西?
-
请注意,它们不匹配,因为没有
\b的匹配atbds #,而另一个则不会 -
可能会尝试另一种方法:
$res = preg_grep('/\btbds\b/i', explode("#", $data)); -
@Miguel 也许您可以帮助我们了解您的真实输入数据,因为您随机生成的内容永远不会找到匹配项——没有生成
#符号。如果您希望我们为您设计优化模式,我们需要充分了解输入可变性。此外,您正在执行 unicode 匹配,但没有提供 unicode 字符。请改进您的问题。
标签: php regex preg-match preg-match-all