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

Php 查找字符串中第一个大写字符的最快方法,php,string,character,uppercase,Php,String,Character,Uppercase,假设您有以下字符串: 迄今为止 找到第一个大写字符所在位置的最快方法是什么?(T在本例中) 我担心性能,因为有些单词很长。使用strpos() 最简单的方法是使用preg_match(如果只有1个匹配项)或preg_match_all(如果需要所有匹配项) 不知道它是不是最快的 为了找到第一个大写字符,我将使用以下的PREG\u OFFSET\u CAPTURE标志: 返回以下内容: Array ( [0] => T [1] => 2 ) 您可以将此逻辑包装成一个函数,并反复使用

假设您有以下字符串:

迄今为止

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

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

使用
strpos()


最简单的方法是使用preg_match(如果只有1个匹配项)或preg_match_all(如果需要所有匹配项)


不知道它是不是最快的

为了找到第一个大写字符,我将使用以下的
PREG\u OFFSET\u CAPTURE
标志:

返回以下内容:

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

我可以想象这样做:

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


a-z字符的解决方案。可能不行

 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';
 }
其他方法

$stringCamelCase = 'stringCamelCase';// hiThere
与preg_split()配合使用:

使用strpbrk()的方式:

这里有一个(或多或少)单线解决方案

$pos = strcspn($string, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ');
将返回第二个参数中任何字符第一次出现的位置,如果没有字符出现,则返回字符串的长度

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

$pos=strcspn($string,'ABCDEFGHJIJKLMNOPQRSTUVWXYZ');
如果($pos
我在自己的应用程序中使用的内容:

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

在我发现数组是多维数组之前,我一直在用这个函数。没有看到任何人的代码提到这一点。要获取我使用的第一个大写字母的位置:

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

?>


你想要第一个大写字母还是第一个大写字母“T”?@HardikPatel:这不是“当然”,问题中不清楚。我编辑了我的问题,但为了以防万一,是任何大写字母,T就是一个例子。谢谢。
PREG\u OFFSET\u CAPTURE
-这是我试图获取匹配位置的标志。他想要的是通用代码,而不是特定于该代码的代码。假设你的代码在他想要字符串“abcXyz”中的“X”时失败@UmakantPatil:自从我写下这个答案以来,这个问题已经被编辑过了。(3次)。自那以后,它的意思发生了很大的变化。如果您下次在对一个非常旧的答案(这个答案已经有一年多的历史了)进行否决表决时,能够回顾一下修订内容,我将不胜感激。对此我深表歉意。我本来会撤销否决票,但我不能这么做,因为上面写着“你的投票被锁定了”@UmakantPatil:没关系,我回家后会删除这个答案,因为它真的不再适用了。干杯:)太棒了,但我不太明白为什么会这样。虽然我在这个字符串
$str='asas.2tAOPPr'上得到12:/K我猜出来了。它尝试检索第一组全部为小写的字符。它不考虑数字,但大多数驼背字符串在中间没有数字。然后获取这些字符的长度。如果找不到匹配项,它将返回整个字符串的长度。差不多。我想你可以运行“/^([^A-Z])*[A-Z].$/”否则。我只是将数字添加到第一个括号中,以获得与原始答案类似的效果-----------------
/^([A-Z\d]*)[A-Z].$
,因为我不想在那里画句号
$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']
$CamelCase = strpbrk($stringCamelCase, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
echo strpos($stringCamelCase, $CamelCase);
$pos = strcspn($string, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ');
$pos = strcspn($string, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ');
if ($pos < strlen($string)) {
    echo "capital letter as index $pos";
}
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;
}
<?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

?>