【问题标题】:How to check whether StringB starts with StringA in PHP?如何在PHP中检查String是否以String开头?
【发布时间】:2012-05-17 18:37:03
【问题描述】:

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

【问题讨论】:

    标签: php string substring match


    【解决方案1】:

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

    【讨论】:

    • 同意我们都应该使用多字节
    • 据我所知,在这种情况下并没有什么不同。
    【解决方案2】:
    substr($StringB, 0, strlen($StringA)) == $StringA
    

    【讨论】:

    • 我喜欢这个解决方案,因为它也适用于空字符串(不像strpos($stringB, $stringA) === 0)。谢谢!
    【解决方案3】:

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

    if (strpos($stringB, $stringA) === 0) {
        // matched
    }
    

    【讨论】:

      【解决方案4】:
      $pos = strpos($StringB, $StringA)
      

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

      编辑:它是位置 0。

      【讨论】:

        【解决方案5】:

        为此使用strpos...

        if(strpos($stringB, $stringA) === 0) {
            // starts with stringA
        }
        

        【讨论】:

          【解决方案6】:

          使用:

          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
          

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

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

          【讨论】:

          • +1 你是对的先生 :) 也是出于我的回答中所述的原因。
          【解决方案7】:

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

          恢复正常:)

          【讨论】:

          • 这是真的,但它是类型转换的特殊性。不是“一般情况”。
          • @MihaiStancu 至少有足够的理由使用=== 进行字符串比较;-)
          • 此外,当字符串在数字后包含字母时,它们的 strlens 会更长,因此即使使用双等号,“999999999999999999998x”“9999999999999999999999y”也会正确比较。
          • @MihaiStancu 那是因为它没有通过 is_numeric 测试:)
          • 确切地说,提取的子字符串将“足够长”以包含数字后面的字符,因此它不会被转换为数字。这意味着您的观察仅在您有意比较 SQL 中的双精度浮点数或大整数时才有用精度...在这种情况下,无论如何您都应该使用GMP。 :P
          【解决方案8】:

          你可以试试:

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

          这将检查 B 是否以 A 开头,而不管字符串大小。

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

          【讨论】:

          • 这不仅是不必要的矫枉过正,$stringA 还可能包含未转义的元字符,导致测试在不应该失败的情况下失败(例如,如果 $stringA 以 $ 开头,它总是会失败)。
          • 您需要将$stringA 传递给preg_quote。但我认为正如 Aretfact2 提到的那样,正则表达式有点矫枉过正。
          • @Artefact2 好点。我确保编辑我的答案以使用 preg_quote 以避免您提到的问题。
          【解决方案9】:

          这样的事情怎么样?

          if (strlen($b) < strlen($a)) {
             //does not match
          }
          
          $len = strlen($a);
          if (substr($b, 1, $len) == $a) {
             //matches
          }
          

          【讨论】:

            猜你喜欢
            • 2012-02-18
            • 1970-01-01
            • 2015-10-21
            • 1970-01-01
            • 1970-01-01
            • 2011-12-15
            • 1970-01-01
            • 2019-12-29
            • 1970-01-01
            相关资源
            最近更新 更多