1

私はAJAXチャットスクリプトを書いていて、時間を解析するためにシステムを統合しています(基本的にBBCodeのように)。問題は、date()で使用するために時刻(UNIXタイムスタンプ)を整数にキャストしようとすると、常に「0」が返されることです。私が見つけて置き換えるために使用しているコードは以下のとおりです。解析しようとしているもののサンプルも追加しました

$out = preg_replace("/\[time\](.*)\[\/time\]/i",date("c",(int)"$1",$out);

サンプル:

<b>GtoXic</b>: [time]1342129366[/time]
4

3 に答える 3

5

実際に整数にキャストしているのはリテラル文字列$1であるため、文字列を整数に変換すると次のように機能します。

  • 文字列の先頭が有効な数値表現である場合は、その形式と互換性のない文字が見つかるまでそれを使用します
  • それ以外の場合はゼロを返します

これを機能させるには、次を使用しますpreg_replace_callback()

$output = preg_replace_callback("/#\[time\](.*)\[/time\]#i", function ($matches) {
  return date("c", $matches[1]);
}, $input);

(int)キャストは実際には不要です。整数を期待する関数に値を渡すと、PHPがこれを自動的に処理します。

于 2012-07-12T22:24:35.330 に答える
2

を使用する必要がありますpreg_replace_callback()

スクリプトが失敗する理由(int)"$1"は、実際には0(ゼロ)であるためです。したがって、引数の1つとして渡される前に、スクリプトはすでにゼロに変換されています。

于 2012-07-12T22:24:45.023 に答える
0

必要なのは、コールバック関数を使用したpreg_replace_callbackです。

$out = "<b>GtoXic</b>: [time]1342129366[/time]";

$out = preg_replace_callback('/\[time\]([0-9]*)\[\/time\]/i', 'test', $out);

function test($matches)
{
  return date("c", (int)$matches[1]);
}
于 2012-07-12T22:38:02.587 に答える