文字列があり、各YYYY-MM-DD HH:MM:SS
日時文字列をUNIXタイムスタンプに置き換えたい。
私は、日時文字列がどこで発生するかを特定することに成功しました。
$my_string = 'Hello world 2014-12-25 10:00:00 and foo 2014-09-10 05:00:00, bar';
preg_match_all('((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))',$my_string,$my_matches, PREG_OFFSET_CAPTURE);
print_r($my_matches);
これにより、一致した日時文字列の値とその場所を含む配列の配列が出力されます。
Array
(
[0] => Array
(
[0] => Array
(
[0] => 2014-12-25 10:00:00
[1] => 12
)
[1] => Array
(
[0] => 2014-09-10 05:00:00
[1] => 40
)
)
)
この時点から、配列をループしてに基づいて置換する予定でしたがstr_replace()
、strtotime()
次のようなことができれば、実行時間が短くなると思います。
$my_string = preg_replace(
'((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))',
strtotime($VALUE_OF_MATCHED_STRING),
$my_string
);
そのため、一致したすべての見つかったインスタンスは、単純にstrtotime()
フォーマットされます。
この結果を得る正しい方法は何ですか?ループは最も実行可能な方法ですか?
preg_replace_callback()
代わりに使用してください。これにより、コールバック関数を使用して検索と置換を実行できます。
echo preg_replace_callback($pattern, function ($m) {
return strtotime($m[0]);
}, $my_string);
$m
一致したアイテムを含む配列です。$m[0]
日付文字列が含まれます。
上記のコードは次のように出力します。
Hello world 1419501600 and foo 1410325200, bar
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加