2

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
 }

私が見ているように、これは $date が 4 桁 - 1 桁または 2 桁 - 1 桁または 2 桁の形式と一致するかどうかを確認するために探しています

一致する場合、IF ステートメントは日付を表示します。一致しない場合、日付の形式が正しくないというエラーが発生します。

ただし、年 $date = '1977' を他に何も (日も月もなしで) 渡すだけでも、true として通過し、日付部分が表示されます。エラーがスローされると思いますか?

誰かが正規表現に欠けているものを指摘できますか? 最後の ^ またはおそらく ?$ は、その一部のみが一致することを意味する可能性があると思いますか?

4

4 に答える 4

3

すべてを完全にグループ化する必要はありません。これは見栄えが良く、同じことを行います:

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"、一致し始めます。

于 2009-07-02T11:31:20.223 に答える
2

これを試して:

'~^(\d\d\d\d)-(\d{1,2})-(\d{1,2})$~'

問題は、正規表現が「?」によって月と日をオプションとして許可していたことでした。キャラクター。

于 2009-07-02T11:29:48.010 に答える
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
于 2009-07-02T11:30:01.117 に答える
2

では、これを分割してみましょう。

  • '~^(\d\d\d\d)(-(\d{1,2})(-(\d{1,2}))?)?$~'
  • ~ - 先頭と末尾は RegExp 区切り文字であるため、実際には正規表現の一部ではありません。
  • ^ - 「これが行頭です」という意味
    • 文字列の途中での一致を回避し、文字列の先頭が一致する必要があるように固定します
  • (\d\d\d\d) - 4 桁の数字に一致 (およびキャプチャ) し、オプションではありません
    • これは\d{4}と書くこともできます
  • (-(\d{1,2})(-(\d{1,2}))?)? - オプションのグループに一致 (およびキャプチャ) します。
    • このグループが存在する場合は、ダッシュの後に 1 桁または 2 桁の数字 (日または月) が続き、その後にダッシュが続き、その後に 1 桁または 2 桁の数字 (日または月) が続く必要があります。
  • $ - 文字列の末尾を意味するため、これと文字列の先頭の ^ は、文字列全体が正規表現に一致する必要があることを意味します。

この正規表現が一致するもののいくつかの例:

  • 1982-08-11
  • 1982-30-01
  • 8127-99-52

一致しない例:

  • 82-08-11
  • 2009-10

ご覧のとおり、この正規表現は実際には有効な日付ではない「日付」を受け入れるため、おそらくstrtotimeなどの何らかの日付処理関数を使用して実行することになります。

于 2009-07-02T11:33:16.693 に答える