首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非preg_match版本: preg_match("/[^a-z0-9]/i",$a,$match)?

非preg_match版本: preg_match("/[^a-z0-9]/i",$a,$match)?
EN

Stack Overflow用户
提问于 2016-02-23 13:13:57
回答 1查看 181关注 0票数 5

所谓的字符串是:

代码语言:javascript
运行
复制
$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_ faster的方式来执行--可能是1000次或100万次,看看哪一种更快、更有效。

在基准测试中,"$a“要长得多。以确保它没有试图扫描整个"$a“,并确保它在检测到"$a”内的违规行为后立即停止。

根据我在网上看到的信息,当第一次匹配时,preg_match就停止了。

更新:

这是基于“主教”给出的答案,很可能很快就会被选为有效答案。

我稍微修改了一下,因为我只想让它报告违反者的角色。但我也评论说,线外,这样基准可以运行没有纠缠。

让我们根据这个答案运行100万次。

代码语言:javascript
运行
复制
$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;

结果是:0.606614112854 (每秒60 %)

让我们用preg_match方法来完成它。

我希望一切都一样。(而且公平)..。(我这么说是因为preg_match中有^字符)

代码语言:javascript
运行
复制
$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;

我在术语“差异”中使用"dif“。

"dif“是..。1.1145210266113

(占了11 %,超过了整整1秒钟)

(如果是1.2,这意味着它比php方式慢了2倍)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-23 14:32:00

您想要在不使用正则表达式的情况下在给定范围内查找第一个字符的位置?您可能需要strspn或它的补体strcspn

代码语言:javascript
运行
复制
$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';
}

输出Input invalid, starting at -def看它的实况

strspn (及其补语)是非常古老的,非常明确的(POSIX偶数)。标准实现是针对此任务进行优化的。PHP只是利用了这个平台实现,所以PHP也应该是快速的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35578572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档