質問
皆さんも私の頭の周りには何における取り組みの内容とそこでの私のpreg_match.
if (preg_match('~^(\d\d\d\d)(-(\d{1,2})(-(\d{1,2}))?)?$~', trim($date), $dateParts)) {
echo the $dateparts and do some magic with them
} else {
tell me the date is formatted wrong
}
私の見るところでこの見た場合、日付のフォーマットを読み込みまし 4桁を選択-1または2桁を選択-1または2部で"年"、小数部で"
または一致の場合に計算書の表示、日付、っていることを確認してくださいそこでエラーが不正確な日を設定します。
しかしすぐに通り過ぎるので、年間 $date='1977年には"何といっても(日は月)のものを通してtrueを表示datepartsいと思っている。
できる人を指摘また僕に足りないのか?私は推測での^可能性もあるの?$ の味するだけマッチ部分をすることはできるのでしょうか?
解決
の絶対にすべてのグループへの必要はありません。これは立派に見えると同じことを行います。
preg_match('~^\d{4}(-\d{1,2}(-\d{1,2})?)?$~', trim($date), $dateParts)
「1977
が」受け入れられている理由は、これも説明 - 月と日の部分がされているの両方のオプション(疑問符は任意のものになります)。
。あなたが(「4つの小数 - 1つのまたは2小数 - 1つのまたは2小数」)言うことを行うには、両方のオプションのグループを削除する必要があります:
preg_match('~^\d{4}-\d{1,2}-\d{1,2}$~', trim($date), $dateParts)
「^
」と「$
は、」あなたが見ている問題とは何の関係もありません。彼らはただの文字列-開始と終了の文字列アンカー、必ず何パターンは説明することは確認された文字列であるよりも、他のの何もないのことを行っています。それらをオフのままにして"blah 1977-01-01 blah"
が一致して開始します。
他のヒント
これを試してください:
'~^(\d\d\d\d)-(\d{1,2})-(\d{1,2})$~'
問題は、正規表現をして、オプションとして、月と日が可能にしました「?」文字ます。
^
と$
は、渡された文字列のそれぞれ最初と最後に自分のパターンを固定する。?
(この場合、括弧のビット)直前のパターンの0または1をマッチング、乗算器である。
あなたのパターンが一致した年、または年と月、または年と月と日;あなたは括弧に従うならば、あなたは最終?
年後のパターンの全体を囲む括弧で動作して表示されます。
^ # beginning of string
(\d\d\d\d) #year
(
-(\d{1,2}) #month after a dash
(
-(\d{1,2}) #date after a dash
)? #date optional
)? # month and date optional
$ # end of string
Okうとしてこれまで専用に作成する方法もあります。
- '~^(\dにてd)(-(\d{1,2})(-(\d{1,2}))?)?$~'
- ~ -の最初と最後は正規表現-区切り文字でないものを正規表現で指定する。
- ^ ることを目的とし "この行の先頭"
- を回避の試合の途中で文字列、およびアンカーでの開始文字列に一致しなければな
- (\dにてd) -試合(えん)の桁数は、オプション
- ここにも書いて \d{4}
- (-(\d{1,2})(-(\d{1,2}))?)? -マッチ(ー)オプションのグループ
- というのがこのグループが存在しなければならないダッシュは二桁の数字(日は月)、ダッシュでは二桁数(回)
- $ ることを目的と終了文字列で、これをきっかけに、^は、文字列の先頭の文字列全体一致しなければならない正規表現.
もうこの正規表現マッチ:
- 1982-08-11
- 1982-30-01
- 8127-99-52
一部の例のない試合:
- 82-08-11
- 2009-10
ご覧の通り、この正規表現を受け入れも"日"とは本当に有効でだらだらと実行で何らかのdate-取り扱い機能など strtotime.