查找字符串中第一个大写字符的最快方法


Fastest way to find first uppercase character in a string

>假设你有这个字符串:

hiThere

找到第一个大写字符位置的最快方法是什么?(本例中T

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

最简单的方法是使用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_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

其他方式

$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);

我会想象这样做:

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

isThis => 2
largerWord => 6

使用 strpos() .

echo strpos($string, "T");

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

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

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

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

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

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

<?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
?>

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';
 }

我在自己的应用程序中使用的内容:

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;
}