gpt4 book ai didi

PHP : non-preg_match version of: preg_match ("/[^a-z0-9]/i", $a, $match)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:50 28 4
gpt4 key购买 nike

假设字符串是:

$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_match 方法可以做到这一点。

如果有非 preg_match 方法可以运行 1000 或 100 万次,我可能会运行基准测试,看看哪个更快、更高效。

在基准测试中,“$a”会更长。确保它不会尝试扫描整个“$a”并确保它在检测到“$a”内的违规行为时立即停止

根据我在互联网上看到的信息,preg_match 在找到第一个匹配项时停止。

更新:

这是基于“bishop”给出的答案,并且很可能很快(很快)被选为有效答案。

我对它做了一点修改,因为我只希望它报告违规者角色。但我也评论说 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;

结果是:0.606614112854(60% 秒)

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

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

$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”。

“差异”是.. 1.1145210266113

(比整整一秒多了 11%)

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

最佳答案

您想在给定范围内找到第一个 字符 的位置,而不使用正则表达式?您可能需要 strspn 或其补充 strcspn :

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

输出 输入无效,从 -def 开始See it live .

strspn(及其补充)非常古老,非常明确(甚至是 POSIX)。标准实现针对此任务进行了优化。 PHP 只是利用该平台实现,因此 PHP 也应该很快。

关于PHP : non-preg_match version of: preg_match ("/[^a-z0-9]/i", $a, $match)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35578572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com