php字符串安全性测试,什么是PHP字符串是否以另一个字符串结尾的最有效测试?...

测试字符串$str是否以子字符串$test结尾的标准php方法是:

$endsWith = substr( $str, -strlen( $test ) ) == $test

这是最快的路吗?

类似:stackoverflow.com/questions/834303/…

您可能会发现s($str)->endsWith($test)或s($str)->endsWithIgnoreCase($test)很有用,如这个独立库中所示。

阿萨夫说的是对的。在PHP中有一个内置函数可以做到这一点。

substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0;

如果$test比$str长,php会给出警告,因此需要先检查一下。

function endswith($string, $test) {

$strlen = strlen($string);

$testlen = strlen($test);

if ($testlen > $strlen) return false;

return substr_compare($string, $test, $strlen - $testlen, $testlen) === 0;

}

很好。正如阿萨夫指出的那样,就地比较似乎要比substr()快。

McRumley的回答很酷,但应该使用"==",而不是"=="。=='更严格,通常会做你想做的,而'=='会导致令人讨厌的意外。McRumley的第三个代码片段是正确的,但前两个不是。在某些错误情况下,substr_Compare()返回false。在php中,false==0,因此代码片段将指示已找到该字符串。使用==,则不会发生这种情况。

我今天遇到了一个bug,它将破坏您从PHP5.5.11及以后提供的解决方案。bugs.php.net/bug.php?ID=67043

@用户2180613:在5.5.12中已修复。3V4L.Org/QGYBH

这种方法的内存开销稍高一点,但速度更快:

stripos(strrev($haystack), $reversed_needle) === 0;

这是最好的当你确切知道什么是针,所以你可以硬编码它颠倒。如果按程序反转针,它会比以前的方法慢。

太聪明了!

+1代表创意!

-1我严重怀疑这是否更快,这很棘手(很酷,但通常没有帮助)。如果干草堆不以针结束,在最坏的情况下,stripos将迭代整个字符串,而substr_compare将最多比较针的长度。是的,substr_compare需要计算干草堆的长度(以及更小的针),但这种方法需要计算并完全复制干草堆,并且可能将整个干草堆转换为小写形式以引导。

很酷的方法,但在很多情况下效率低下(如答案本身所述)!尽管如此,你还是会对自己的创造力和表现出更多的方法来做你想象中的事情表示支持。干杯!

我测试了这个方法,发现它比公认的答案快。即使草垛和针都是在飞行中反转的,速度也会更快。

@你有没有测试过你的怀疑是否合理?

@不,不值得花时间去做基准测试,因为substr_compare()工作得很好。

很聪明,但我希望这是一个两行的,第一行是对读者的评论。

$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0

负偏移"从字符串末尾开始计数"。

在我看来,这是最好的解决方案之一

应该是公认的答案

+如果可以的话是200。这里的关键洞察是使用负长度得到字符串的结尾部分。您还可以使用-ve长度的SUBSTR,并对$test执行==操作。其他答案都很糟糕。

这里有一个简单的方法来检查一个字符串是否以另一个字符串结尾,方法是在应该找到该字符串的地方给strpos一个偏移量:

function stringEndsWith($whole, $end)

{

return (strpos($whole, $end, strlen($whole) - strlen($end)) !== false);

}

简单明了,我认为这在PHP4中是可行的。

这取决于你关心的效率。

由于使用了SUBSTR的额外副本,您的版本使用了更多的内存。

另一个版本可以在不复制的情况下搜索原始字符串中最后一次出现的子字符串,但可能会由于更多的测试而变慢。

最有效的方法可能是从-sterlen(test)位置到字符串末尾逐字符执行循环并进行比较。这是您希望进行的最小数量的比较,几乎没有使用任何额外的内存。

另一种方法是使用strrpos函数:

strrpos($str, $test) == strlen($str) - strlen($test)

但这并不快。

我希望下面的答案既有效又简单:

$content ="The main string to search";

$search ="search";

//For compare the begining string with case insensitive.

if(stripos($content, $search) === 0) echo 'Yes';

else echo 'No';

//For compare the begining string with case sensitive.

if(strpos($content, $search) === 0) echo 'Yes';

else echo 'No';

//For compare the ending string with case insensitive.

if(stripos(strrev($content), strrev($search)) === 0) echo 'Yes';

else echo 'No';

//For compare the ending string with case sensitive.

if(strpos(strrev($content), strrev($search)) === 0) echo 'Yes';

else echo 'No';

不知道这是不是很快,但对于一个字符测试,这些工作,也:

(array_pop(str_split($string)) === $test) ? true : false;

($string[strlen($string)-1] === $test) ? true : false;

(strrev($string)[0] === $test) ? true : false;

通过正则表达式检查它的最简单方法

例如,要检查给定的邮件是否为gmail:

echo (preg_match("/@gmail\.com$/","example-email@gmail.com"))?'true':'false';

我认为strrchr()这样的逆向函数可以帮助您最快地匹配字符串的末尾。

这是纯PHP,不调用外部函数,strlen除外。

function endsWith ($ends, $string)

{

$strLength = strlen ($string);

$endsLength = strlen ($ends);

for ($i = 0; $i < $endsLength; $i++)

{

if ($string [$strLength - $i - 1] !== $ends [$i])

return false;

}

return true;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值