0

如果两者的长度都是可变的,如何检查是否StringB 以开头StringA

4

9 回答 9

3

在 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 了;-)。

于 2012-05-17T18:41:02.507 回答
2
substr($StringB, 0, strlen($StringA)) == $StringA
于 2012-05-17T18:40:40.167 回答
2

使用strpos怎么样?(http://php.net/strpos)

if (strpos($stringB, $stringA) === 0) {
    // matched
}
于 2012-05-17T18:41:00.870 回答
1

采用:

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

或其他更昂贵的操作的正则表达式,应该用于需要检查许多事情的情况

正则表达式引擎需要编译正则表达式字符串,并且它们使用大量回溯和大量循环字符串来找到它们的匹配项。

于 2012-05-17T18:39:37.803 回答
1
$pos = strpos($StringB, $StringA)

如果 $pos 是 1 或 0(我忘了哪个),那么你知道字符串 B 以字符串 A 开头。

编辑:它是位置 0。

于 2012-05-17T18:41:02.077 回答
1

为此使用strpos ...

if(strpos($stringB, $stringA) === 0) {
    // starts with stringA
}
于 2012-05-17T18:42:58.610 回答
1

答案已被接受,但以下方法 - 不幸的是,由于 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

恢复正常:)

于 2012-05-18T15:21:22.403 回答
0

你可以试试:

if(preg_match('/^'.preg_quote($stringA).'.*/', $stringB){ do some stuff }

无论字符串大小如何,这将检查 B 是否以 A 开头。

编辑:提出了一个很好的观点。如果您想对可能包含正则表达式特殊字符的字符串使用 preg_match,请使用 preg_quote($string) 确保在使用正则表达式中的字符串之前将其转义。

于 2012-05-17T18:38:55.900 回答
0

这样的事情怎么样?

if (strlen($b) < strlen($a)) {
   //does not match
}

$len = strlen($a);
if (substr($b, 1, $len) == $a) {
   //matches
}
于 2012-05-17T18:41:14.027 回答