通过使用PHP的StartsWith/EndsWith函数
我会上传使用 PHP 版本的 startsWith 和 endsWith,在过去写过现在仍经常使用的。
每次都写 strpos 也不是个好办法,所以我用这种方式实现。
我尝试写一个startsWith函数
function startsWith($haystack, $needle) {
return (strpos($haystack, $needle) === 0);
}
我試著寫出了“endsWith”。
如果不使用strrpos编写的话,也想写一个类似的EndsWith函数。
function endsWith($haystack, $needle) {
return (strlen($haystack) > strlen($needle)) ? (substr($haystack, -strlen($needle)) == $needle) : false;
}
我真是写得太难懂了啊…我有些沮丧的心情…如果haystack的长度比needle大,就从haystack的末尾提取出与needle长度相同的字符串进行比较,如果相同则返回TRUE,否则返回FALSE。
我个人使用的函数是将strlen函数改为mb_strlen函数,以便支持多字节字符。但是在我的环境中,即使将mb_strlen改回strlen也能正常运行的样子…。
如果使用UTF8处理字符的环境,可以放心使用strlen。
看一下 strrpos。
PHP: strrpos
(PHP 4, PHP 5, PHP 7)
strrpos — 在字符串中查找子字符串最后出现的位置
描述
strrpos
int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )在字符串 haystack 中查找子字符串 needle 最后出现的位置。
由于strrpos函数返回值是相对于字符串开头的位置,所以如果要将其用作endsWith函数使用,需要稍加处理。
尝试使用strrpos函数来编写
function endsWith($haystack, $needle) {
return (strrpos($haystack, $needle) === strlen($haystack) - strlen($needle));
}
比起之前使用 substr 的方法,现在的方式更加简洁清晰。
function endsWith($haystack, $needle) {
return (strrpos($haystack, $needle) === strlen($haystack) - strlen($needle));
}
foreach(array("e", "ge", "oge", "hoge", "hog", "hogehoge") as $needle) {
echo endsWith("hoge", $needle) ? "TRUE" : "FALSE";
echo "\n";
}
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
你的动作已经变得有规律了!
试试看放入一些多字节字符
function endsWith($haystack, $needle) {
return (strrpos($haystack, $needle) == strlen($haystack) - strlen($needle));
}
foreach(array("e", "ge", "げge", "eげge", "geげge", "hog", "hogeげge") as $needle) {
echo endsWith("hogeげge", $needle) ? "TRUE" : "FALSE";
echo "\n";
}
TRUE
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
不知道为什么我感觉不太满意,但结果还是符合期望!
由于对多字节字符相关的问题有点担心,所以稍后会进行调查并添加信息!