2011-03-07 11 views
0

フォーラムラグビースタイルのスコアゲームを開発しており、ゲームのセットを解析するためのregxパーサーを開発しています。PHP Regexヘルプ - フォーマットに基づいたデータセットを解析する

各ポストは(違いは、何人かの人々がゲームを壊すためにカンマを使用することができ、またいくつかは、スコアhypernateもある - または2のいずれかのcombinatio)フォーマットの下に可能性を持つことができます:

TEAMAを25〜 31 TEAMB TEAMC 28-35 TEAMD TEAME 38-10 TEAMF TEAMG 21-15 TEAMH

TEAMA 25 31 TEAMB TEAMC 28 35 TEAMD TEAME 38 10 TEAMF TEAMG 21 15 TEAMH

TEAMA 25-31 TEAMB、 TEAMC 28〜35 TEAMD、 TEAME 38-10 TEAMF、 TEAMG 21-15 TEAMH

TEAMA 25 31 TEAMB、 TEAMC 28 35 TEAMD、 TEAME 38 10 TEAMF、

TEAMG 21 15 TEAMHは、基本的にチームは、常に5つの文字であることが期待されるスコアは、に座っ2つのチームの間では、必ずしも個々のポストのゲームの量は必ずしも同じではないかもしれません。つまり、1つのポストは1つのゲームまたは20のゲームになる可能性があります。ゲーム。 [TEAMA] [SCORE] [SCORE] [TEAMB]は1つのゲームと見なされます。

私は爆発を使用し始めましたが、多くの運がなかったし、残念なことにregxの経験があまりないので、上記のような柔軟な方法を探していました。

助けてください。

答えて

3

各結果を分割するよりも、結果を一致させる方が簡単です(例::

preg_match_all('/(?P<teamA>\w{5})\s+(?P<scoreA>\d+)[\s-](?P<scoreB>\d+)\s+(?P<teamB>\w{5})/', $str, $m, PREG_SET_ORDER); 
print_r($m); 

は、それぞれの結果のためにあなたを与える、何かのように:

[0] => Array 
    (
     [0] => TEAMA 25 31 TEAMB 
     [teamA] => TEAMA 
     [1] => TEAMA 
     [scoreA] => 25 
     [2] => 25 
     [scoreB] => 31 
     [3] => 31 
     [teamB] => TEAMB 
     [4] => TEAMB 
    ) 
0
(チーム名は英数字あると仮定し)代わりの

$raw_str = "TEAMA 25-31 TEAMB TEAMC 28-35 TEAMD TEAME 38-10 TEAMF TEAMG 21-15 TEAMH"; 
preg_match_all('/(?<first_team_name>[A-Z]+)\s+(?<first_team_score>[0-9]+)-(?<second_team_score>[0-9]+)\s+(?<second_team_name>[A-Z]+)/i',$raw_str,$matches); 
$scores = array(); 
foreach($matches[0] as $index => $match) 
{ 
    $scores[] = array(
        'first_team_name' => $matches['first_team_name'][$index], 
        'first_team_score' => $matches['first_team_score'][$index], 
        'second_team_name' => $matches['second_team_name'][$index], 
        'second_team_score' => $matches['second_team_score'][$index] 
        ); 
} 

print_r($scores); 

出力:

アレイ ( [0] =>配列 ( [FIRST_TEAM_NAME] => TEAMA [first_team_score] => 25 [SECOND_TEAM_NAME] => TEAMB [second_team_score] => 31 )

[1] => Array 
    (
     [first_team_name] => TEAMC 
     [first_team_score] => 28 
     [second_team_name] => TEAMD 
     [second_team_score] => 35 
    ) 

[2] => Array 
    (
     [first_team_name] => TEAME 
     [first_team_score] => 38 
     [second_team_name] => TEAMF 
     [second_team_score] => 10 
    ) 

[3] => Array 
    (
     [first_team_name] => TEAMG 
     [first_team_score] => 21 
     [second_team_name] => TEAMH 
     [second_team_score] => 15 
    ) 

0

正規表現である:ここ[A-Z]{5}\s\d+[\s\-]\d+\s[A-Z]{5}

は、Perlでの使用の実施例である:

my $content = "TEAMA 25-31 TEAMB TEAMC 28 35 TEAMD TEAME 38-10 TEAMF TEAMG 21-15 TEAMH"; 
my (@scores) = $content =~ m![A-Z]{5}\s\d+[\s\-]\d+\s[A-Z]{5}!g; 

foreach my $score (@scores) { 
    print "$score\n"; 
} 

出力である:

TEAMA 25-31 TEAMB

TEAMC 28 35 TEAMD

TEAME 38-10 TE AMF

TEAMG 21-15 TEAMH

あなたはチーム名のanycaseようにあなたは、[A-Z]の[A-ZA-z]はINSEADを使用できる場合

関連する問題