【问题标题】:Fastest way to find first uppercase character in a string在字符串中查找第一个大写字符的最快方法
【发布时间】:2012-04-25 14:45:33
【问题描述】:

假设你有这个字符串:

hiThere

找到第一个大写字符在哪里的最快方法是什么? (本例中为T

我担心性能,因为有些词很长。

【问题讨论】:

  • 你想要第一个大写字母还是第一个大写“T”?
  • @HardikPatel:这不是“当然”,从问题中不清楚。
  • 我编辑了我的问题,但以防万一,是大写,T 是一个例子。谢谢。

标签: php string character uppercase


【解决方案1】:

使用strpos()

echo strpos($string, "T");

【讨论】:

  • 他想要通用代码,而不是特定于该代码。假设当他想要字符串“abcXyz”中的“X”时你的代码会失败
  • @UmakantPatil:自从我写下这个答案以来,这个问题已经被编辑过了。 (3次)。从那以后,它的含义发生了很大的变化。如果您下次对一个非常旧的答案(这个答案已有一年多的历史)投票时可以查看修订,我将不胜感激。
  • 很抱歉。我会撤销投票,但我不能这样做,因为它说“你的投票已被锁定”
  • @UmakantPatil:没关系,我回家后会删除这个答案,因为它真的不再适用了。干杯:)
【解决方案2】:

最简单的方法是使用 preg_match(如果只有 1 个匹配项)或 preg_match_all(如果你想要所有匹配项) http://php.net/manual/en/function.preg-match.php

preg_match_all('/[A-Z]/', $str, $matches, PREG_OFFSET_CAPTURE);

不确定是不是最快..

【讨论】:

  • PREG_OFFSET_CAPTURE - 那是我试图获得匹配位置的标志。
【解决方案3】:

为了找到第一个大写字符,我会使用preg_matchPREG_OFFSET_CAPTURE 标志:

$string = "hiThere";

preg_match( '/[A-Z]/', $string, $matches, PREG_OFFSET_CAPTURE );

print_r( $matches[0] );

返回以下内容:

Array ( [0] => T [1] => 2 )

你可以把这个逻辑包装成一个函数并反复使用它:

function firstUC ( $subject ) {
  $n = preg_match( '/[A-Z]/', $subject, $matches, PREG_OFFSET_CAPTURE );
  return $n ? $matches[0] : false;
}

echo ( $res = firstUC( "upperCase" ) ) ? $res[1] : "Not found" ;
// Returns: 5

echo ( $res = firstUC( "nouppers!" ) ) ? $res[1] : "Not found" ;
// Returns: Not found

【讨论】:

    【解决方案4】:

    我想这样做:

    strlen(preg_replace("/^([a-z]*)[A-Z].*$/", "$1", $str));
    

    isThis => 2
    largerWord => 6

    【讨论】:

    • 太棒了,但我不太明白为什么会这样。虽然我在这个字符串上得到 12 $str = 'asas.2tAOPPr'; :/
    • 我想通了。它尝试检索全部为小写的第一组字符。它不考虑数字,但大多数驼峰式字符串中间没有数字。然后获取这些字符的长度。如果找不到匹配项,则返回整个字符串的长度。
    • 差不多。猜猜你可以运行 "/^([^A-Z])*[A-Z].*$/" 否则。
    • 我只是将数字添加到第一个括号中,以获得与您的原始答案类似的工作 -------------------- / ^([a-z\d]*)[A-Z].*$ as I真的不想要那里的句号
    【解决方案5】:

    a-z 字符的解决方案。可能无法使用 unicode

     preg_match('/[A-Z]/', $str, $m);
     if(isset($m[1])) {
        echo 'First upper char is '.$m[1].' and located at '. strpos($string, "T");
     }
     else {
        'There is no upperchar';
     }
    

    【讨论】:

      【解决方案6】:

      其他方式

      $stringCamelCase = 'stringCamelCase';// hiThere
      

      preg_split() 的方式:

      $array      = preg_split('#([A-Z][^A-Z]*)#', $stringCamelCase, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
      echo strlen($array[0]);// $array = ['string', 'Camel', 'Case']
      

      strpbrk() 方法:

      $CamelCase = strpbrk($stringCamelCase, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
      echo strpos($stringCamelCase, $CamelCase);
      

      【讨论】:

        【解决方案7】:

        这是(或多或少)单行解决方案。

        $pos = strcspn($string, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ');
        

        strcspn 将返回第二个参数中任何字符第一次出现的位置,如果没有字符出现,则返回字符串的长度。

        返回不包含 str2 中任何字符的 str1 的初始段的长度。

        $pos = strcspn($string, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ');
        if ($pos < strlen($string)) {
            echo "capital letter as index $pos";
        }
        

        【讨论】:

          【解决方案8】:

          我在自己的应用程序中使用了什么:

          function acronyms($s){
            $s=str_replace(array('& ','of ','the ','and '),'',strtolower($s));
            $s=ucwords(trim($s)); //Collecting data
            if(strlen($s)>0 && preg_match_all('/[A-Z]/',$s,$m))   return implode('',$m[0]);
          return $s;
          }
          

          【讨论】:

            【解决方案9】:

            在我发现数组是多维的之前,我用这个函数度过了最糟糕的时光。没有看到任何人的代码提到这一点。要获得我使用的第一个大写字母的位置:

            <?php
            
            $field = "i_select_Interior_Quote";
            preg_match( '/[A-Z]/', $field, $m, PREG_OFFSET_CAPTURE );
            
            $posi=$m[0][1];
            
            echo '<br><br>'.$posi; // outputs 9
            
            ?>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-14
              • 2015-01-14
              • 2012-09-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多