如何检查String是否以PHP中的String开头?

时间:2012-05-17 18:37:03

标签: php string substring match

如果两者的长度都是可变的 ,那么如何检查StringB 是否与StringA 开始?< / p>

9 个答案:

答案 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
}