PHP はシングル スレッドの手続き型スクリプト言語1であるため、思いどおりに動作しません。
echo
2を呼び出したときにのみ関数を実行するようにトリガーすることはできません。代わりに必要なのは、追加の変数です。
$newVariable = preg_replace_callback("#\[%(.{1,20})%\]#", function($matches) {
// Do your thang here
}, $maintext);
// $maintext remains the same as it was when you started, do stuff with it here
// When you come to output the data, do...
echo $newVariable;
この問題には、上記のコードをオンデマンドで呼び出すことができる関数にラップし、出力バッファリング コールバックを使用するなど、他のアプローチもあります (脚注 #2 を参照)。比較的簡単な問題です。
記録のために、許可されたコンテンツを絞り込むと、正規表現がより良くなると思います。それは、望ましくない文字と一致する可能性があります。私はこれがより良いと思います:
#\[%(\w{1,20})%\]#
a-zA-Z0-9_
これにより、プレースホルダー内の文字のみが許可されます。
1 他の人は、PHP は今やオブジェクト指向言語だと言うかもしれませんが、彼らは間違っています。基本的には基本的に同じように動作し、スクリプト言語のままですが、多くの OO 機能が提供されます。
2 これに非常に近いことを行うことは可能ですが、それが良いアイデアであることはめったになく、この問題に対処するにはあまりにも高度すぎます。
編集
e
いずれかのメソッドを使用してコールバック (修飾子または)を介して置換を渡す場合preg_replace_callback()
、コールバック関数は直接出力するのではなく、新しい文字列を返す必要があることに注意することが重要です。
これは、すべてのステートメントのコードが裏返しに実行され、echo
(コールバック関数内の) "内側" ステートメントが "外側"echo
ステートメント (preg_replace()
が呼び出される行) の前に実行されるためです。は正しく出力されません。
例えば:
$str = "This is my string which contains a %placeholder%";
echo preg_replace_callback('/%(\w+)%/', function($matches) {
echo "replacement string";
}, $str);
// Wrong - outputs "replacement stringThis is my string which contains a "
echo preg_replace_callback('/%(\w+)%/', function($matches) {
return "replacement string";
}, $str);
// Right - outputs "This is my string which contains a replacement string"