如果两者的长度都是可变的1> ,那么如何检查StringB
是否与StringA
开始?< / p>
答案 0 :(得分:3)
在PHP中,没有像其他语言那样的StartsWith()。作为替代方案,您可以使用mb_strpos()
:
if(mb_strpos($source, $start) === 0)
您可以创建自己的StartsWith()函数:
function StartsWith($source, $start)
{
return (mb_strpos($source, $start) === 0);
}
我强烈建议您使用Multibyte String Functions。这样,您可以在2025年之前使用Unicode字符串,当时PHP具有完全的Unicode支持; - )。
答案 1 :(得分:2)
substr($StringB, 0, strlen($StringA)) == $StringA
答案 2 :(得分:2)
如何使用strpos? (http://php.net/strpos)
if (strpos($stringB, $stringA) === 0) {
// matched
}
答案 3 :(得分:1)
使用:
strcmp() / strcasecmp()
它考虑长度是否不同,只比较直到最小长度。
http://php.net/manual/en/function.strcmp.php
或:
substr_compare()
如果你需要比较StringB是否以StringA开头并且确定它不是arround的另一种方式(其中StringB将是较短的那个)。
http://www.php.net/manual/en/function.substr-compare.php
上述两个函数都很快,它们只迭代最短的字符串一次。
相反:
strpos()
哪个会尝试在StringB中找到StringA where ,以便返回StringA启动的位置。
preg_match
或其他更常用的正则表达式,应该用于需要检查很多东西的情况
正则表达式引擎需要编译正则表达式字符串,并且他们使用大量的回溯和大量的字符串循环来查找匹配。
答案 4 :(得分:1)
$pos = strpos($StringB, $StringA)
如果$ pos是1或0(我忘了哪个),那么你知道字符串B以字符串A开头。
编辑:这是位置0。
答案 5 :(得分:1)
使用strpos ...
if(strpos($stringB, $stringA) === 0) {
// starts with stringA
}
答案 6 :(得分:1)
答案已被接受,但不幸的是,由于php的性质,以下方法是唯一正确的方法:使用strncmp()
或===
。原因如下:
考虑以下示例输入(除了最后一个数字,两个字符串都相等):
$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确定字符串之前是否看起来是数字 比较。但是,如果数值太大,它们会溢出 进入
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
恢复正常状态:)
答案 7 :(得分:0)
你可以尝试:
if(preg_match('/^'.preg_quote($stringA).'.*/', $stringB){ do some stuff }
这将检查B是否以A开头而不管字符串大小。
编辑:提出了一个好点。如果要对可能包含正则表达式特殊字符的字符串使用preg_match,请使用preg_quote($ string)以确保在使用正则表达式中的字符串之前对其进行转义。答案 8 :(得分:0)
这样的事情怎么样?
if (strlen($b) < strlen($a)) {
//does not match
}
$len = strlen($a);
if (substr($b, 1, $len) == $a) {
//matches
}