4

URL (または任意の文字列) に次のパターン ####-##-## の形式が含まれているかどうかを確認したい

それを行うための便利な str_replace() または正規表現を持っている人はいますか?

何かのようなもの:

contains_date_string($string);

$string に ####-##-## が含まれている場合に true を返します

ありがとうございました!!!

4

4 に答える 4

3
if (preg_match('/\b\d{4}-\d{2}-\d{2}\b/', $str)) {
    // ...
}

単語の境界(\b)でうまくいかない場合は、ネガティブな後読みと先読みを試すことができます。

if (preg_match('/(?<!\d)\d{4}-\d{2}-\d{2}(?!\d)/', $str)) {
    // ...
}

追加の検証として、この回答に記載されているようcheckdate()な無効な日付を取り除くために使用できます。9999-02-31

于 2012-05-07T02:52:39.490 に答える
3

preg_matchと組み合わせて使用​​しcheckdateます:

function contains_date($str)
{
    if (preg_match('/\b(\d{4})-(\d{2})-(\d{2})\b/', $str, $matches))
    {
        if (checkdate($matches[2], $matches[3], $matches[1]))
        {
            return true;
        }
    }
    return false;
}
于 2012-05-07T02:55:52.160 に答える
0
'/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/'

「1998 年 13 月 32 日のようなことが過ぎ去って検証されないようにします。」

私はグーグルからこれを得ました... http://www.devnetwork.net/viewtopic.php?f=29&t=13795

有望に見えます。これが、 stackoverflowが最もアクセスしやすいSEOであるのと同じものを探している人に役立つことを願っています.

于 2012-05-07T02:56:42.600 に答える
0

ここで与えられたテストはうまくいくはずです:

if (preg_match('#[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])#', $str)) {
   // do something
}

どのような正規表現を選択する場合でも、注意してください! マシンが 2004-04-01 を認識した場合、別の方法で指示しない限り、1 月 4 日とエイプリル フールを区別できません。

于 2012-05-07T02:56:44.590 に答える