質問

yyyy-mm-ddの形式で日付を探すPHPで正規表現があります

私が持っているのは: [\d]{4}-[\d]{2}-[\d]{2}

preg_matchを使用して日付をテストしていますが、問題は 2009-11-10 作品、しかし 2009-11-1033434 同様に機能します。 Regexをやってからしばらく経ちましたが、正しい場所で止まることを確認するにはどうすればよいですか?やってみました /([\d]{4}-[\d]{2}-[\d]{2}){1}/, 、しかし、それは同じ結果を返します。

どんな助けも大歓迎です。

役に立ちましたか?

解決

必要なのは、特にアンカーです ^$. 。前者は文字列の始まりと一致し、後者は終わりと一致します。

私がするもう一つのポイントはです [] 不要です。 \d キャラクターの範囲外でその意味を保持します。

したがって、あなたの正規表現は次のようになるはずです: /^\d{4}-\d{2}-\d{2}$/.

他のヒント

日付が終了するとどのように期待しますか?

終了の場合、次の場合 $ トリックをする必要があります。

非桁のキャラクターによって、次のネガティブ アサーション (?!\d) 同様に機能します。

^20[0-2][0-9]-((0[1-9])|(1[0-2]))-([0-2][1-9]|3[0-1])$

の問題を支援するために少し余分なチェックを追加しました MMDD ユーザーが混同します。これはすべての日付の混乱をキャッチするわけではありませんが、 YYYY その間の部分 20002029, 、 MM の間に 0112 そしてその DD の間に 0131

あなたはおそらく表現にアンカーを置きたいと思っています。すなわち

^[\d]{4}-[\d]{2}-[\d]{2}$

CARETとDOLLAR SIGNに注意してください。

[\d]{4}-[\d]{2}-[\d]{2}?

疑問符が「非グリーディ」を意味する場所

あなたはおそらく先を見たいと思うことを望んでいます(あなたのエンジンがそれらをサポートしていると仮定して、PHP/PREG/PCREはそうします)

先を見据えて、アサーション(または肯定的なアサーション)を使用すると、「xが続くべきですが、xは試合の一部であるべきではない」と言うことができます。次の構文を試してください。

\d{4}-\d{2}-\d{2}(?=[^0-9])

アサーションはこの部分です

(?=[^0-9])

それは「私の正規表現の後、次のキャラクターは数になることはできません」と言っています

それがあなたが望む/必要なものをあなたに取得しない場合、あなたの入力の例と動作していないあなたのPHPコードを投稿してください。これらの2つの項目は、これらの種類の問題をデバッグするのに非常に役立ちます。

表現の開始時と終了時に「^」と「$」記号の両方を試してみることができます。

/^[\d]{4}-[\d]{2}-[\d]{2}$/

それぞれ文字列の開始と終了と一致します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top