2

「2012 年 3 月 23 日金曜日 15:21:08」という形式の日付/時刻を preg_replace に置き換えるにはどうすればよいですか? この形式の日付はテキストに数回存在するため、現在の時刻/日付に置き換える必要があります。

ありがとう、

クリス

4

3 に答える 3

6

必要なのは、3文字(Fri)に続いてスペースと別の3文字(Mar)に一致する式です。

まず、いくつかの文字を一致させる必要があります。

/[a-z]/

次のように正確に3文字を一致させることができます。

/[a-z]{3}/

...大文字と小文字を区別しないようにする必要があります。

/[a-z]{3}/i

...つまり、最初の部分は次のとおりです。

/[a-z]{3} [a-z]{3}/i

次に、1つまたは2つの数値を一致させる必要があります。数値はエスケープシーケンスで表すことができる\dので、次を使用します。

/\d{1,2}/

次に、同じエスケープシーケンスを使用して、時間文字列を照合します。

/\d{2}:\d{2}:\d{2}/

...最後の4桁の年が続きます:

/\d{4}/

すべてをまとめると、次のようになります。

/[a-z]{3} [a-z]{3} \d{1,2} \d{2}:\d{2}:\d{2} \d{4}/i
// Fri       Mar      23     15 :  21 :  08    2012

次に、現在の日付と時刻に置き換える必要があります。そのために私たちが行く通常の場所はdate()関数ですが、それを動的に置換に組み込むにはどうすればよいですか?文字列リテラルとして渡すことも、コールバック関数を使用してから取得することもできますpreg_replace_callback()ただしpreg_replace()e、置換文字列がPHPコードに対して評価されるようにする修飾子を提供します。他のPHPと同様に、慎重に使用する必要がありますeval()が、これは正当な使用例です。

したがって、最終的なPHPコードは次のようになります。

preg_replace(
  '/[a-z]{3} [a-z]{3} \d{1,2} \d{2}:\d{2}:\d{2} \d{4}/ie',
  "date('D M j H:i:s Y')",
  $str
);

それが機能しているのを見る

于 2012-04-05T14:43:43.227 に答える
4

オプションの有限セットをリストすることは、これらのタスクにとって一種の優れていると思います。また、誤検知を防ぐことにもなります。これらは、日付形式の各部分に一致するパターンです。

  • 日々:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)
  • 月:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
  • 日:\d{1,2}
  • 時間:\d{1,2}:\d{2}:\d{2}
  • 年:\d{4}

すべてをまとめる:

(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2} \d{1,2}:\d{2}:\d{2} \d{4}

コードは次のようになります。

$current_date = date('D M j H:i:s Y');
$text = preg_replace(
  '/(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2} \d{1,2}:\d{2}:\d{2} \d{4}/i',
  $current_date,
  $text
);

実際の例を参照してください。

于 2012-04-05T14:53:16.403 に答える
0
preg_replace('/Fri Mar 23 15:21:08 2012/',date('D M d H:i:s Y'),$string);

通常、やりたいことをします。

于 2012-04-05T14:44:42.930 に答える