1

正規表現パターンとオプションの一致に問題があります。基本的に、次の 3 つの形式の勤務時間を含む文字列から情報を抽出しようとします。

$d1 = 'Fr: 9-12;';
$d2 = 'Mo: 9-12 und 15-18; alle 14 Tage spez. Migräneberatung bis 20 Uhr;';
$d3 = 'Mo: 9-12; alle 14 Tage spez. Migräneberatung bis 20 Uhr;';

$regex = '
    /
        (Mo|Di|Mi|Do|Fr|Sa|So)+:          # day follow by colon
            \s+?                          # a optional space
        (\d+)\-(\d+)                      # time from - to
        (?:\s+?und\s+?(\d+)\-(\d+))       # optional time from - to
            ;                               
        (?:([^;]+))                       # optional addt info
    /x';

$rc = preg_match_all($regex, $d2, $m);

print_r($m);

文字列$d2は問題なく動作しており、予想されるすべての一致が得られますが、文字列$d1$d3は一致しません。2 番目の時間部分と追加情報テキストを使用してオプションのグループ化を試みましたが、機能しません。代わりに空の一致が得られます。キズが見えない…

上記の部分文字列のすべての出現を取得するために使用したいと思いpreg_match_allます。これは、月曜日から日曜日までの毎日の大きな文字列であり、上記の部分文字列が$d1 - $d31 日あたりの形式であるためです。この部分文字列の終了マーカーとしてセミコロンも使用できるかどうかはわかりません([^;]+)。これが機能しない場合は、1 日の部分文字列の終わりを示す別の区切り文字を選択し、最初に大きな文字列を分割してループ内の部分文字列と一致させることができます。

ヒントをいただければ幸いです。助けてくれてありがとう!

4

1 に答える 1

2

私はここで間違っているかもしれませんが、これはうまくいくようです:

$regex = '
    /
        (Mo|Di|Mi|Do|Fr|Sa|So):           # day follow by colon
            \s+?                          # a optional space
        (\d+)\-(\d+)                      # time from - to
        (?:\s+?und\s+?(\d+)\-(\d+))?      # optional time from - to
            ;
        (?:([^;]+))?                      # optional addt info
    /x';

オプションの要素にオプション性 (疑問符) を追加しただけです。

于 2012-11-02T08:16:06.020 に答える