验证,如果字符串以给定的子字符串开头

时间:2010-07-15 09:27:55

标签: php

我在$str变量中有一个字符串。

我如何验证是否以某个词开头?


示例

$str = "http://somesite.com/somefolder/somefile.php";

当我写下面的脚本时返回yes

if(strpos($str, "http://") == '0') echo "yes";

但即使我写了

,它也会返回
if(strpos($str, "other word here") == '0') echo "yes";

我认为strpos如果找不到子字符串(或空值)则会返回zero

所以,我该怎么办,如果我想验证字符串开头的单词?(在这种情况下我可能必须使用===吗?)

10 个答案:

答案 0 :(得分:35)

你需要这样做:

if (strpos($str, "http://") === 0) echo "yes"

===运算符是一种严格的比较,不会强制类型。如果您使用==,那么false,空字符串null0,空数组和其他一些内容将是等效的。

请参阅Type Juggling

答案 1 :(得分:15)

您应该查看identity operator(===),查看documentation

您的测试成为:

if(strpos($str, "http://") === 0) echo "yes"; //returns yes

答案 2 :(得分:2)

检查

if(strpos($str, "http://") === 0) echo "yes";

因为==对于false和& 0检查documentation

答案 3 :(得分:2)

另一种选择是:

if (preg_match("|^(https?:)?\/\/|i", $str)) {
    echo "the url starts with http or https upper or lower case or just //.";
}

如下所示:http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/

答案 4 :(得分:2)

PHP确实有2个函数来验证字符串是否以给定的子字符串开头:

  • strncmp(区分大小写);
  • strncasecmp(不区分大小写);

因此,如果您只想测试http(而不是https),可以使用:

 if (strncasecmp($str,'http://',7) == 0) echo "we have a winner"

答案 5 :(得分:1)

PHP 8 现在为此提供了一个专用函数 str_starts_with

if (str_starts_with($str, 'http://')) {
   echo 'yes';
}

答案 6 :(得分:0)

if(substr($str, 0, 7)=="http://") {
    echo("Statrs with http://");
}

答案 7 :(得分:0)

the documentation中有一个大红色警告:

  

此函数可能返回布尔值FALSE,但也可能返回一个非布尔值,其值为FALSE,例如0或“”。有关更多信息,请阅读有关布尔值的部分。使用===运算符测试此函数的返回值。

strpos可能会返回0false0等于false0 == false)。然而,它与相同为false,您可以使用0 === false进行测试。所以正确的测试是if (strpos(...) === 0)

请务必阅读区别,重要的是:http://php.net/manual/en/language.operators.comparison.php

答案 8 :(得分:0)

strncmp($str, $word, strlen($word))===0

比strpos更有效率

答案 9 :(得分:0)

从PHP 8(2020-11-24)开始,您可以使用str_starts_with

if (str_starts_with($str, 'http://')) {
   echo 'yes';
}