2012-04-05 15 views
1

どのように私はこの形式で日付/時刻を 'Fri Mar 23 15:21:08 2012'と置き換えることができますか?preg_replace? この形式の日付はテキストの中に数回存在し、現在の時刻/日付に置き換える必要があります。PHP:preg置き換えの日付時刻

何が必要まあおかげで、

クリス

+1

あなたは 'str_replace( 'Fri Mar 23 15:21:08 2012'、$ newdate、$ originaltext);'を使用できますか? – Elen

+0

まだ何か試しましたか? –

+0

はい私はDaveRandomから1つをトクする、その素晴らしい作業! – Chris

答えて

5

は、スペースや他の三文字(Mar)に続く3つの文字(Fri)と一致する式です。

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

/[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 
); 

See it working

0
preg_replace('/Fri Mar 23 15:21:08 2012/',date('D M d H:i:s Y'),$string); 

通常、あなたがやりたいです。

+0

質問は正確な日付ではなく、指定された*形式*で日付を置き換える方法です(これは形式の単なる例です)。特定の日付を置き換える場合は、単純な 'str_replace'で十分です。 –

+0

Soooo、私は完全に質問を理解していないと結論づけなければなりません:)! – jbrtrnd

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 
); 

a working exampleを参照してください。

+0

私は有限リストを考えましたが、表現がとても乱雑に見えて、私はそれから離れました。私は自然言語のテキストのブロックの衝突の危険性は非常に小さいので、この "any any alpha"のアプローチは受け入れられるという複雑なフォーマットでは良いですが、良い解決策は+1です。 – DaveRandom