0

私はこの文字列を持っています

UVIC まで徒歩わずか 5 分の家具付きの自炊式 2 ベッドルーム スイートは、9 月 1 日に利用できます。

今、私はそれを抽出するために pregmatch を使用しています: これが正規表現です。

'/\bavailable\\s(?P<date_available>[?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?|immediately]+[\\s\d]+)[st|nd|rd|th]?/i'

現在、この正規表現は文字列から抽出できます。

Available september 1st.
Available September 2nd
available september 3rd
available september 4th
available sept 1

出力例は次のとおりです。

Array
(
    [0] => available September 1
    [date_available] => September 1
    [1] => September 1
)

しかし、文字列が次の場合に抽出する方法が見つかりません。

Available for september 1st.
Available in September 2nd
available since september 3rd
available at september 4th

誰でも私がこれに対処するのを助けることができますか? ありがとう

4

3 に答える 3

1

ワイルドカード A ~ Z、2 ~ 5 文字 (「on」などに一致):

$regex = '/\bavailable[ ]*(?:[a-z]{2,5})?[ ]*' .
    '(?P<date_available>immediately|now|' .
    '(?:(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?' .
    '|Apr(?:il)?|May|Jun(?:e)|Jul(?:y)?|Aug(?:ust)?' .
    '|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)' .
    '[ ]+[\d]+))' .
    //end <date_available>
    '(?:st|nd|rd|th)?/i';

使用法:

$lines = array(
    'Fully furnished self contained 2 bedroom suite just 5 minute walk to UVIC is available now.',
    'bedroom suite just 5 minute walk to UVIC is available on September 34.',
    'bedroom suite just 5 minute walk to somewhere is available on Apr 1.',
    );

foreach ($lines as $line) {
    echo $line, "\n<br>\n";
    if (preg_match($regex, $line, $matches) === 1) {
        print_r($matches['date_available']);
    } else {
        echo "Does not match.";
    }
    echo "\n<br>\n";
}
于 2012-08-23T08:43:37.803 に答える
0

以下はすべての例で機能しますが、正確な構文がわからないため、PHPに「名前付きサブパターン」を入れていません

\bavailable\s+(?:(?:for|in|at|since)\s+)?((?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sept(?:ember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:st|nd|rd|th)?)
于 2012-08-23T09:01:32.873 に答える
0

私は実際にあなたのものをまったく動作させることができません。[ ]グループ化して括弧で交互にするのではなく、角括弧で文字クラスを使用しようとしているようです( )

以下は、おそらくあなたの要件に基づいて入手できる最短のものです

$pattern = '/\bavailable\s+(?:(?:for|in|at|since)\s+)?((?:immediately|now)|(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Oct(?:ober)?|(?:Sept|Nov|Dec)(?:ember)?)\s+?\d{1,2}(?:st|nd|rd|th)?)/i';

これには、必要な一致が常に含まれるため、名前付きサブパターンは含まれませんが、名前付きサブパターン$matches[1]を含めたい場合は、いつでも含めることができます。

$pattern = '/\bavailable\s+(?:(?:for|in|at|since)\s+)?(?P<date_available>(?:immediately|now)|(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Oct(?:ober)?|(?:Sept|Nov|Dec)(?:ember)?)\s+?\d{1,2}(?:st|nd|rd|th)?)/i';

@EthanB の以前の解決策に応じて、 date の序数の接尾辞を取得していないようです。st, nd, rd, thその場合は必須ではありません。それを含めないことでさらに短くすることができます。しようとしても意味がありません。日番号の後の任意のものに一致します。

于 2012-08-23T13:47:58.840 に答える