假设您有这个字符串:
hiThere
。最快的方法是找到第一个大写字母在哪里?(例如此示例中的 T
)。我担心性能问题,因为有些单词很长。如果只需要匹配一个结果,最简单的方法是使用 preg_match;如果需要匹配所有结果,可以使用 preg_match_all。
http://php.net/manual/en/function.preg-match.phppreg_match_all('/[A-Z]/', $str, $matches, PREG_OFFSET_CAPTURE);
不确定它是否是最快的..
preg_match
的 PREG_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']
$CamelCase = strpbrk($stringCamelCase, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
echo strpos($stringCamelCase, $CamelCase);
strlen(preg_replace("/^([a-z]*)[A-Z].*$/", "$1", $str));
isThis
=> 2
largerWord
=> 6
/ ^([a-z\d]*)[A-Z].*$
,因为我实际上不想在其中加入句点。 - Sarfaraaz在找到这个数组是多维数组之前,我对这个函数感到很困惑。没有看到任何人的代码提到过这一点。为了获取第一个大写字母的位置,我使用了以下代码:
<?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
?>
$pos = strcspn($string, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ');
strcspn将返回第二个参数中任何字符的第一次出现的位置,如果没有字符出现,则返回字符串的长度。
返回str1中不包含str2中任何字符的初始段的长度。
$pos = strcspn($string, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ');
if ($pos < strlen($string)) {
echo "capital letter as index $pos";
}
strpos()
函数。echo strpos($string, "T");
解决方案适用于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;
}