PHP:preg_match的非preg_match版本:preg_match(";/[^a-z0-9]/i";,$a$match)?
假定字符串为:PHP:preg_match的非preg_match版本:preg_match(";/[^a-z0-9]/i";,$a$match)?,php,preg-match,Php,Preg Match,假定字符串为: $a = "abc-def" if (preg_match("/[^a-z0-9]/i", $a, $m)){ $i = "i stopped scanning '$a' because I found a violation in it while scanning it from left to right. The violation was: $m[0]"; } echo $i; 上面的例子:应该指出“-”是违规行为 我想知道是否有一种非预赛的方式可以做
$a = "abc-def"
if (preg_match("/[^a-z0-9]/i", $a, $m)){
$i = "i stopped scanning '$a' because I found a violation in it while
scanning it from left to right. The violation was: $m[0]";
}
echo $i;
上面的例子:应该指出“-”是违规行为
我想知道是否有一种非预赛的方式可以做到这一点
我可能会运行基准测试,如果有一个非preg_匹配的方式来做这件事,也许1000或100万次,看看哪个更快更有效
在基准中,“$a”将更长。
确保它没有尝试扫描整个“$a”,并确保它在检测到“$a”内的违规行为时立即停止
根据我在互联网上看到的信息,preg_match在发现第一个匹配时停止
更新:
这是基于“主教”给出的答案,很可能很快(很快)被选为有效答案
我对它做了一点修改,因为我只想让它报告违规者的角色。但我也评论了line out,这样基准测试就可以在没有纠缠的情况下运行
让我们根据这个答案进行100万次跑步
$start_time = microtime(TRUE);
$count = 0;
while ($count < 1000000){
$allowed = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$input = 'abc-def';
$validLen = strspn($input, $allowed);
if ($validLen < strlen($input)){
#echo "violation at: ". substr($input, $validLen,1);
}
$count = $count + 1;
};
$end_time = microtime(TRUE);
$dif = $end_time - $start_time;
echo $dif;
我使用“dif”来指代术语“差异”
“dif”是<代码>1.1145210266113
(比整秒钟多了11%)
(如果它是1.2,这意味着它比php方式慢2倍)是否要查找不在给定范围内的第一个字符的位置,而不使用正则表达式?您可能需要或其补充: 输出
输入无效,从-def开始
strspn
(及其补码)非常古老,非常明确(甚至POSIX)。标准实现为此任务进行了优化。PHP只是利用了这个平台实现,所以PHP也应该很快。您尝试过使用在线正则表达式测试仪吗?我个人最喜欢的是看一看https://regex101.com/r/lT9uG7/1
。该正则表达式代码将简单地查找第一个-
。这解决了您的问题吗?我希望preg\u match
会更慢,因为它确实有处理正则表达式、设置内部数据结构等的开销。为了减轻这种开销的影响,请将(研究)模式修饰符添加到preg\u match
中。我希望研究该模式将提高这个特定综合基准的regex整体性能,尽管在实际操作中,研究可能并不相关。
$start_time = microtime(TRUE);
$count = 0;
while ($count < 1000000){
$input = 'abc-def';
preg_match("/[^a-z0-9]/i", $input, $m);
#echo "violation at:". $m[0];
$count = $count + 1;
};
$end_time = microtime(TRUE);
$dif = $end_time - $start_time;
echo $dif;
$allowed = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$input = 'abc-def';
$validLen = strspn($input, $allowed);
if (strlen($input) !== $validLen) {
printf('Input invalid, starting at %s', substr($input, $validLen));
} else {
echo 'Input is valid';
}