Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.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_match的非preg_match版本:preg_match(";/[^a-z0-9]/i";,$a$match)?_Php_Preg Match - Fatal编程技术网

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';
}