1

1つの日時文字列でのみ1つのタイプの区切り文字を検証できる正規表現を作成する方法はありますか?

たとえば、2010年4月30日は正しいが、2010年4月30日は正しくありません。

私はグーグルでバックトラックについて何かを見つけましたが、それをどのように使用するかはよくわかりません。たとえば、この正規表現がある場合:

(?P<date>((31(?![\.\-\/\—\ \,\–\-]{1,2}(Feb(ruary)?|Apr(il)?|June?|(Sep(?=\b|t)t?|Nov)(ember)?)))|((30|29)(?![\.\-\/\—\ \,\–\-]{1,2}Feb(ruary)?))|(29(?=[\.\-\/\—\ \,\–\-]{1,2}Feb(ruary)?[\.\-\/\—\ \,\–\-]{1,2}(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))|(0?[1-9])|1\d|2[0-8])[\.\-\/\—\ \,\–\-]{1,2}(Jan(uary)?|Feb(ruary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sep(?=\b|t)t?|Nov|Dec)(ember)?)[\.\-\/\—\ \,\–\-]{1,2}((1[6-9]|[2-9]\d)\d{2}))

では、ここでバックトラックをどのように使用するのでしょうか。

どうもありがとうございます。

4

3 に答える 3

5

あなたの質問に対する答えではありませんが、strtotime()の使用を検討しましたか?

これは、英語の日付と時刻を解析できる非常に柔軟な関数です。

Feb 2, 2010
February 2, 2010
02/02/10
4 weeks ago
Next Monday

日付が解析できない場合、関数は戻りますfalse(または-1、PHP 5.1より前)。

いくつかの落とし穴があります-xx-xx-xxxx表記法を使用すると、ヨーロッパの日付を想定する傾向があることを覚えていDD-MM-YYYYます-しかし、全体として、正規表現よりもはるかにうまくいく可能性があります。

于 2010-07-05T10:25:17.917 に答える
1

Pekkaからの回答はあなたの問題をはるかにうまく解決しますが、私はあなたの質問のこの部分に答える価値があると思います:

では、ここでバックトラックをどのように使用するのでしょうか。

「05-07-2010」と「05/07/2010」に一致するが「05-07/2010」には一致しない正規表現の例を次に示します。

"#^\d{2}([/-])\d{2}\1\d{4}$#"
        ------     --

正規表現の最も重要な部分には下線が引かれています。\1これは、最初のキャプチャサブパターンへのバックリファレンス([/-])です。詳細については、PHPマニュアルの「バックリファレンス」の章を参照してください。

于 2010-07-05T12:15:54.110 に答える
0

あなたが持っている正規表現は、文字列が日時である可能性のある任意の形式であることを確認しているようです。与えられた例を確認したいだけなら、2010年4月30日、この簡単な例を使用できます。

([\ d] {1,2})/([\ d] {1,2})/([\ d] {2,4})

(日と月は1〜2桁、年は2〜4桁)

于 2010-07-05T10:38:27.677 に答える