3

PHP で文字列から日付形式を置き換えるために正規表現を使用したいと思います。

次のような文字列があります。

TEXT TEXT TEXT {POST_DATE,m/d/Y} TEXT TEXT TEXT

{POST_DATE,m/d/Y}を含むすべての文字列を、date() などの外部関数から取得した日付と、入力文字列の日付形式に置き換えたいと考えています。

私はすでに以下のコードを使用しようとしましたが、フォーマット文字列が返されました:

$string = preg_replace('/\{POST_DATE,(.*)\}/',date('$1'),$template);

ここで戻り文字列を取得しました:

TEXT TEXT TEXT m/d/Y TEXT TEXT TEXT

どこが間違っていたのか、テキストに多くの{POST_DATE,m/d/Y}文字列がある場合、上記の方法に従ってすべてを置き換えるにはどうすればよいかわかりません。

4

1 に答える 1

1

日付関数には、'$1' のリテラル値が渡されています。preg_replace 関数は、それがキャプチャされたサブパターンの値であると解釈することを知っていますが、日付関数はそうではありません。

preg_replace で "e" 修飾子を使用して、関数に $1 を渡すことができます。

preg_replace('/\{POST_DATE,(.*?)\}/e','date("$1")',$input);

また、 ? を追加して .* を非貪欲にしたことに注意してください。入力文字列に 2 番目の } 文字があると、意図したよりも多くの文字がキャプチャされるためです。

これをテストするには、次のことを試してください。

$s = "TEXT TEXT TEXT {POST_DATE,m/d/y} TEXT TEXT TEXT";
print preg_replace('/\{POST_DATE,(.*?)\}/e','date("$1")',$s);

出力は次のとおりです。

TEXT TEXT TEXT 12/19/12 TEXT TEXT TEXT

非推奨のコードを避けるには、preg_replace_callback を使用することをお勧めしますが、それほどエレガントではありません。

$s = "TEXT TEXT TEXT {POST_DATE,m/d/y} TEXT TEXT TEXT";
print preg_replace_callback('/\{POST_DATE,(.*?)\}/',
                            create_function('$matches',
                                            'return date($matches[1]);'),
                            $s);

(同じ出力が得られます)

于 2012-12-19T04:29:35.847 に答える