【问题标题】:Check if whole string contains same character检查整个字符串是否包含相同的字符
【发布时间】:2017-03-24 03:35:37
【问题描述】:

我想检查一个字符串是否包含重复零次或多次的字符,例如:

  • 如果我的字符串是aaaaaabbbbc*****,它必须返回true

  • 如果它包含aaabcd**%***,它必须返回false

换句话说,如果字符串有 2 个或多个唯一字符,则必须返回 false

如何在 PHP 中解决这个问题?

PS:没有 RegEx 有没有办法做到这一点?

【问题讨论】:

    标签: php string validation unique


    【解决方案1】:

    您可以在每个字符上 split 然后 count 数组以获得唯一值。

    if(count(array_count_values(str_split('abaaaa'))) == 1) {
        echo 'True';
    } else {
        echo 'false';
    }
    

    演示:https://eval.in/760293

    【讨论】:

    • 不错的答案,但如果如下所示可能会更优雅:return count(array_count_values(str_split('abaaaa'))) == 1;
    【解决方案2】:
    count(array_unique(explode('', string)) == 1) ? true : false;
    

    【讨论】:

    • 这将产生一个警告explode(): Empty delimeter。请改用str_split
    【解决方案3】:

    您可以使用带有反向引用的正则表达式:

    if (preg_match('/^(.)\1*$/', $string)) {
        echo "Same characters";
    }
    

    或者一个简单的循环:

    $same = true;
    $firstchar = $string[0];
    for ($i = 1; $i < strlen($string); $i++) {
        if ($string[$i] != $firstchar) {
            $same = false;
            break;
        }
    }
    

    【讨论】:

      【解决方案4】:

      为了好玩:

      <?php
      
      function str2Dec($string) {
          $hexstr = unpack('H*', $string);
          $hex = array_shift($hexstr);
      
          return hexdec($hex);
      }
      
      function isBoring($string) {
          return str2Dec($string) % str2Dec(substr($string, 0, 1)) === 0;
      }
      
      $string1 = 'tttttt';
      $string2 = 'ttattt';
      
      var_dump(isBoring($string1)); // => true
      var_dump(isBoring($string2)); // => false
      

      显然这只适用于小字符串,因为一旦它变得足够大,INT 就会溢出,并且 mod 不会产生正确的值。所以,不要使用这个:) - 发布它只是为了展示与通常的想法不同的想法。

      【讨论】:

      • 对于不熟悉unpack()hexdec() 的穷人,您能否edit 解释一下这种技术是如何工作的(何时工作)?
      【解决方案5】:
      strlen(str_replace($string[0], '', $string)) ? false : true;
      

      【讨论】:

        【解决方案6】:

        您可以检查唯一字符的数量是否大于1。即使输入字符串为空,这也会很好地执行:(Demo)

        $string = 'aaaba';
        var_export(
            strlen(count_chars($string, 3)) < 2   // false
        );
        

        或者,您可以通过第一个字符修剪字符串,但如果输入字符串没有长度,这将生成警告/通知。 (Demo)

        $string = 'aaaba';
        var_export(
            !strlen(trim($string, $string[0]))   // false
        );
        

        附言是的,您可以使用!strlen(trim($string, @$string[0])) 来防止由零长度字符串引起的警告/通知,但我避免像瘟疫那样抑制错误,因为它通常会给代码带来难闻的气味。

        【讨论】:

          【解决方案7】:

          正则表达式:^(.)\1{1,}

          ^: 字符串开头

          (.):匹配并捕获单个字符。

          \1{1,}: 一次或多次使用捕获的字符。

          For this you can use regex

          或:

          PHP code demo

          $string="bbbb";
          if($length=strlen($string))
          {
              substr_count($string,$string[0]);
              if($length==substr_count($string,$string[0]))
              {
                  echo "Do something";
              }
          }
          

          【讨论】:

          • {1,}+ 相同
          • @Barmar 谢谢我知道,但大多数时候我用这个而不是+
          • @IbrahimAzharArmar 更新了我的帖子,请检查。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-29
          • 2011-03-23
          • 2012-11-16
          • 1970-01-01
          相关资源
          最近更新 更多