9

まず第一に、正規表現にあまり慣れていないことをお詫びします。私が望むのは、任意のタイプの文字列から mysql 日付のような日付を抽出する正規表現です。今まで私はこれを使用していました:^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$

ただし、他の文字列と日時文字列から日付パターンを抽出したいのですが^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]).、いくつかのオンライン正規表現テスターに​​基づいて正規表現を変更しようとしましたが、失敗します。また、3桁の日で結果が得られることもありました。

つまり、sting は で始まり、yyyy-mm-ddその後にスペース文字や数字などが続きます。日付を抽出するにはどうすればよいですか?

アップデート

ここで preg_match を使用して正規表現をテストしています: http://www.pagecolumn.com/tool/pregtest.htm

これまでのところ、機能しているように見える唯一のものは

[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])
4

5 に答える 5

7

If your string has more than one date form value occurrence and you wanna capture all of them you should use preg_match_all function and if it's not preg_match is enough. Also using ^ and $ means input string is should be just a date, so avoid it.

<?php
$input_string = "yes today is 2013-10-24";
if(preg_match("/\d{4}-\d{2}-\d{2}/", $input_string, $match))
{
    print_r($match);
}
else
    echo "not matched";
////////////////////////
/* Output:
Array
(
    [0] => 2013-10-24
)
*/

Live demo

于 2013-10-24T11:04:30.550 に答える
4

To match dates wherever they appear, remove the $ and ^ anchors from your original regex.

To match dates at the start of any input remove the $ at the end (leave the ^).

You can also put the remaining pattern inside parentheses for convenience, so that the match is also captured as a whole.

Your suggested improvement has a spurious dot at the end which will match any character; that was the reason for returning matches with three-digit days.

于 2013-10-24T11:03:35.433 に答える
2

Just replace ^ for \b.

\b(\d{4}-\d{2}-\d{2})
于 2013-10-24T11:04:32.673 に答える