0

正規表現を使用して次のデータを削除しようとしています:

mlb_s_left1=Baltimore 3   ^NY Yankees 12 (FINAL)&mlb_s_right1_1=W: Hughes L: Britton&mlb_s_right1_count=1&mlb_s_url1=http://sports.espn.go.com/mlb/boxscore?gameId=320801110&mlb_s_left2=^Chicago Sox 3   Minnesota 2 (FINAL)&mlb_s_right2_1=W: Peavy L: Diamond S: Reed&mlb_s_right2_count=1&mlb_s_url2=http://sports.espn.go.com/mlb/boxscore?gameId=320801109

ホーム チーム (最初の都市)、ホーム スコア (1 桁目)、アウェイ チーム (2 番目の都市)、アウェイ スコア (2 桁目)、およびゲーム内の位置 (括弧内) ごとに分割したいと考えています。これは私が現在持っている正規表現ですが、非常に間違っていると感じています。

preg_match_all('/mlb_s_left[0-9]=(?P<hometeam>.*?) (?P<homescore>.*?)   (?P<awayteam>.*?) (?P<awayscore>.*?)\((?P<time>.*?)\)/', $content, $matches);

これを機能させるためのあらゆる助けをいただければ幸いです。

4

2 に答える 2

2

このような何かがあなたを近づけるはずです。

preg_match_all('/mlb_s_left\d+=(?P<hometeam>\D+)\s+(?P<homescore>\d+)\s+(?P<awayteam>\D+)\s+(?P<awayscore>\d+)\s*\((?P<time>[^)]+)\)/',
    $content, $matches);

\d任意の数字に一致し、数字以外のすべて\D一致することに注意してください。

[^)]+1 つ以上の閉じ括弧ではない文字に一致します。\s+1 つ以上の空白文字と\s*一致し、0 個以上の空白文字と一致します。

都市名に数字が含まれている場合、これはうまく機能しません。また、巨大な文字列がある場合、どこかでハングアップする可能性があります。あなたはそれを分割して、もう少し断片的に一致させることを検討するかもしれません.

一般的に言えば.*?、基本的にほとんどすべてに一致するため、パターン マッチとしては避けます。データについて知っていることに基づいて、正規表現をできるだけ具体的にするのが最善です。

于 2012-08-02T02:52:07.550 に答える
2

PHP 5.4.5 で次のコード スニペットをテストしました。

    <?php
$foo = 'mlb_s_left1=Baltimore 3   ^NY Yankees 12 (FINAL)&mlb_s_right1_1=W: Hughes L: Britton&mlb_s_right1_count=1&mlb_s_url1=http://sports.espn.go.com/mlb/boxscore?gameId=320801110&mlb_s_left2=^Chicago Sox 3   Minnesota 2 (FINAL)&mlb_s_right2_1=W: Peavy L: Diamond S: Reed&mlb_s_right2_count=1&mlb_s_url2=http://sports.espn.go.com/mlb/boxscore?gameId=320801109';
preg_match_all('/mlb_s_left\d=\^?(?P<hometeam>[a-zA-Z]+(?:\s+[a-zA-Z]+)*)\s+(?P<homescore>\d+)\s+\^?(?P<awayteam>[a-zA-Z]+(?:\s+[a-zA-Z]+)*)\s+(?P<awayscore>\d+)\s+\((?P<time>\w+)\)/', $foo, $matches, PREG_SET_ORDER);

print_r($matches);

?>

出力:

    Array
(
    [0] => Array
        (
            [0] => mlb_s_left1=Baltimore 3   ^NY Yankees 12 (FINAL)
            [hometeam] => Baltimore
            [1] => Baltimore
            [homescore] => 3
            [2] => 3
            [awayteam] => NY Yankees
            [3] => NY Yankees
            [awayscore] => 12
            [4] => 12
            [time] => FINAL
            [5] => FINAL
        )

    [1] => Array
        (
            [0] => mlb_s_left2=^Chicago Sox 3   Minnesota 2 (FINAL)
            [hometeam] => Chicago Sox
            [1] => Chicago Sox
            [homescore] => 3
            [2] => 3
            [awayteam] => Minnesota
            [3] => Minnesota
            [awayscore] => 2
            [4] => 2
            [time] => FINAL
            [5] => FINAL
        )

)
于 2012-08-02T03:07:04.513 に答える