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

配列が多次元であることがわかるまで、この関数で最も苦労しました。誰のコードもこれに言及していませんでした。私が使用した最初の大文字の位置を取得するには:

<?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 に答える
1

これは(多かれ少なかれ)1行のソリューションです。

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

strcspnは、2 番目の引数で任意の文字が最初に出現する位置を返します。文字が出現しない場合は、文字列の長さを返します。

str2 の文字を含まない str1 の最初のセグメントの長さを返します。

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

az 文字のソリューション。おそらくユニコードは機能しません

 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 に答える