2

形式の文字列がいくつかあります

AA11
AAAAAA1111111
AA1111111

文字列のアルファベットと数字のコンポーネントを分離する最良の (最も効率的な) 方法はどれですか?

4

5 に答える 5

8

それらがすべて一連の英字で、その後に一連の数字が続き、英字以外の文字がない場合、sscanf()はおそらく regexp よりも効率的です

$example = 'AAA11111';
list($alpha,$numeric) = sscanf($example, "%[A-Z]%d");

var_dump($alpha);
var_dump($numeric);
于 2012-07-13T19:51:20.547 に答える
1

これは、以下を使用した実際の例preg_split()です。

$strs = array( 'AA11', 'AAAAAA1111111', 'AA1111111');

foreach( $strs as $str) 
    foreach( preg_split( '/([A-Za-z]+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $temp)
        var_dump( $temp);

この出力

string(2) "AA"
string(2) "11"
string(6) "AAAAAA"
string(7) "1111111"
string(2) "AA"
string(7) "1111111"
于 2012-07-13T19:55:05.380 に答える
1

preg_split仕事をうまくやるべきです。

preg_split('/(\w+)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE);

preg ライブラリは文字列の処理において驚くほど効率的であるため、より原始的な文字列関数を使用して手動で記述できるものよりも効率的であると思います。しかし、テストを行い、自分の目で確かめてください。

于 2012-07-13T19:52:58.567 に答える
1

RegEx をすぐに使用する代わりに、次のようなチェックを 1 つ追加できます。

if (ctype_alpha($testcase)) {
   // Return the value it's only letters
} else if(ctype_digit($testcase)) {
   // Return the value it's only numbers
} else {
   //RegEx your string to split nums and alphas
}

編集:明らかに、私の答えはパフォーマンスが向上するという証拠を提供しませんでした。そのため、次の結果を生成するテストを行いました:

  1. preg_split には 5.3319189548492 秒かかりました
  2. sscanf には 3.4432129859924 秒かかりました

そして答えはsscanf

結果を生成したコードは次のとおりです。

$string = "AAAAAAAAAA111111111111111";
$count = 1000000;

function prSplit($string) {
    return preg_split( '/([A-Za-z]+)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
}

function sScanfTest($string) {
    return sscanf($string, "%[A-Z]%[0-9]");
}

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

$startTime1 = microtime_float();
for($i=0; $i<$count; ++$i) {
    prSplit($string);
}
$time1 = microtime_float() - $startTime1;
echo '1. preg_split took '.$time1.' seconds<br />';

$startTime2 = microtime_float();
for($i=0; $i<$count; ++$i) {
    sScanfTest($string);
}
$time2 = microtime_float() - $startTime2;
echo '2. sscanf took '.$time2.' seconds';
于 2012-07-13T19:53:33.640 に答える