【发布时间】:2012-05-17 18:37:03
【问题描述】:
如何检查StringB 以StringA 开头 如果两者的长度都是可变的?
【问题讨论】:
标签: php string substring match
如何检查StringB 以StringA 开头 如果两者的长度都是可变的?
【问题讨论】:
标签: php string substring match
在 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 ;-)。
【讨论】:
substr($StringB, 0, strlen($StringA)) == $StringA
【讨论】:
strpos($stringB, $stringA) === 0)。谢谢!
使用 strpos 怎么样? (http://php.net/strpos)
if (strpos($stringB, $stringA) === 0) {
// matched
}
【讨论】:
$pos = strpos($StringB, $StringA)
如果 $pos 是 1 或 0(我忘记了),那么你知道字符串 B 以字符串 A 开头。
编辑:它是位置 0。
【讨论】:
为此使用strpos...
if(strpos($stringB, $stringA) === 0) {
// starts with stringA
}
【讨论】:
使用:
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
或其他更昂贵的操作的正则表达式,应该用于需要检查很多事情的情况
正则表达式引擎需要编译正则表达式字符串,并且它们使用大量回溯和大量循环字符串来找到它们的匹配项。
【讨论】:
答案已经被接受,但以下方法是-不幸的是由于 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
恢复正常:)
【讨论】:
=== 进行字符串比较;-)
你可以试试:
if(preg_match('/^'.preg_quote($stringA).'.*/', $stringB){ do some stuff }
这将检查 B 是否以 A 开头,而不管字符串大小。
编辑:提出了一个很好的观点。如果您想对可能包含正则表达式特殊字符的字符串使用 preg_match,请使用 preg_quote($string) 确保在使用正则表达式中的字符串之前将其转义。
【讨论】:
$stringA 传递给preg_quote。但我认为正如 Aretfact2 提到的那样,正则表达式有点矫枉过正。
这样的事情怎么样?
if (strlen($b) < strlen($a)) {
//does not match
}
$len = strlen($a);
if (substr($b, 1, $len) == $a) {
//matches
}
【讨论】: