如果两者的长度都是可变的,如何检查是否StringB
以开头?StringA
9 回答
在 PHP 中,没有像其他语言那样的 StartsWith()。作为替代方案,您可以使用mb_strpos()
:
if(mb_strpos($source, $start) === 0)
您可以创建自己的 StartsWith() 函数:
function StartsWith($source, $start)
{
return (mb_strpos($source, $start) === 0);
}
我强烈建议使用多字节字符串函数。这样你就可以在 2025 年之前使用 Unicode 字符串,那时 PHP 已经完全支持 Unicode 了;-)。
substr($StringB, 0, strlen($StringA)) == $StringA
使用strpos怎么样?(http://php.net/strpos)
if (strpos($stringB, $stringA) === 0) {
// matched
}
采用:
strcmp() / strcasecmp()
它考虑了长度是否不同,并且只比较到最小长度。
http://php.net/manual/en/function.strcmp.php
或者:
substr_compare()
如果您需要比较 StringB 是否以 StringA 开头并确定它不是另一种方式(其中 StringB 将是较短的)。
http://www.php.net/manual/en/function.substr-compare.php
上述两个函数都很快,它们只遍历最短的字符串一次。
相对于:
strpos()
它将尝试在 StringB 中的任何位置找到 StringA ,以返回 StringA 开始的位置。
preg_match
或其他更昂贵的操作的正则表达式,应该用于需要检查许多事情的情况
正则表达式引擎需要编译正则表达式字符串,并且它们使用大量回溯和大量循环字符串来找到它们的匹配项。
$pos = strpos($StringB, $StringA)
如果 $pos 是 1 或 0(我忘了哪个),那么你知道字符串 B 以字符串 A 开头。
编辑:它是位置 0。
为此使用strpos ...
if(strpos($stringB, $stringA) === 0) {
// starts with stringA
}
答案已被接受,但以下方法 - 不幸的是,由于 php 的性质 - 唯一正确的方法:使用strncmp()
or ===
。原因如下:
考虑以下示例输入(除了最后一个数字外,两个字符串都相等):
$StringA = '9223372036854775808';
$StringB = '9223372036854775807';
现在,我们采取以下解决方案:
var_dump(substr($StringB, 0, strlen($StringA)) == $StringA);
你能猜出返回值吗?它的:
true
等等,什么,为什么?!原因如下:https ://bugs.php.net/bug.php?id=54547
PHP 通常从外部字符串中获取大部分数据,即使它们是数字。因此,如果您的代码读取$_POST['key'] == 123
并且$_POST['key']
实际上是'123'
,它仍然可以工作,因为 PHP 会在计算相等性之前对字符串执行类型转换为整数。
也一样$_GET['key'] == $_POST['key']
,假设两个字符串都有数字。这就是踢球者:
PHP 在比较之前确定字符串是否首先看起来是数字。但是,如果数值变得太大,它们会溢出到 a 中
double
,从而失去精度;这会导致比较返回意外结果。
相反,要比较字符串,您必须非常明确:
// use strncmp() - the === here is not really necessary btw
var_dump(0 === strncmp($StringB, $StringA, strlen($StringA)));
// use === to perform the comparison in a strict manner
var_dump(substr($StringB, 0, strlen($StringA)) === $StringA);
回报:
false
false
恢复正常:)
你可以试试:
if(preg_match('/^'.preg_quote($stringA).'.*/', $stringB){ do some stuff }
无论字符串大小如何,这将检查 B 是否以 A 开头。
编辑:提出了一个很好的观点。如果您想对可能包含正则表达式特殊字符的字符串使用 preg_match,请使用 preg_quote($string) 确保在使用正则表达式中的字符串之前将其转义。
这样的事情怎么样?
if (strlen($b) < strlen($a)) {
//does not match
}
$len = strlen($a);
if (substr($b, 1, $len) == $a) {
//matches
}