10

假设你有这个字符串:

hiThere

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

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

4

9 回答 9

23

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

不知道是不是最快..

于 2012-04-13T08:24:14.717 回答
7

为了找到第一个大写字符,我会使用以下PREG_OFFSET_CAPTURE标志preg_match

$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
于 2012-04-13T08:27:28.323 回答
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);
于 2012-05-07T00:26:56.023 回答
2

我想这样做:

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

isThis=> 2
largerWord=>6

于 2012-04-13T08:27:33.993 回答
1

使用strpos().

echo strpos($string, "T");
于 2012-04-13T08:16:48.103 回答
1

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

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

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

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

$pos = strcspn($string, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ');
if ($pos < strlen($string)) {
    echo "capital letter as index $pos";
}
于 2013-02-13T15:22:35.220 回答
1

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

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

?>
于 2016-10-19T15:27:51.347 回答
0

az 字符的解决方案。可能不会工作 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';
 }
于 2012-04-13T08:27:45.307 回答
0

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

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;
}
于 2014-06-11T10:39:46.820 回答