0

[%xxx%] がある場合はいつでも関数を実行しようとしています (必要に応じて、プレースホルダーとして機能します)。

Bla bla bla blabla. Blablabla bla bla.
[%hooray%]
Blabla hey bla bla. [%yay%] blabla bla.

私はほとんどPHPの初心者ですが、なんとか頭を割って次のことを思いつきました(やったー、どうにかして正規表現の基本を理解することができました!):

$maintext = preg_replace("#\[%(.{1,20})%\]#", "display_products('$1')"), $maintext);
echo $maintext; 

e修飾子を使用してみました。preg_replace_callback を使用してみましたが、すべて多少は機能しますが、$maintext 変数をエコーする前に関数を実行する必要はありません。

この人たちの助けはありますか?

編集 正規表現は問題ではありません-それは正常に機能しています。$maintext をエコーするときにのみ関数を実行する方法を理解する必要があるだけです... preg_replace_callback はすぐに関数を実行します...

4

3 に答える 3

0

ob_start はコールバック関数を受け入れます。このトピックの詳細を読むことができます: Making all PHP file output pass through a "filter file" before being displayed.

于 2012-07-18T11:40:01.583 に答える
0

PHP はシングル スレッドの手続き型スクリプト言語1であるため、思いどおりに動作しません。

echo2を呼び出したときにのみ関数を実行するようにトリガーすることはできません。代わりに必要なのは、追加の変数です。

$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"
于 2012-07-18T08:51:50.103 に答える
0

echo を何度も使用するスクリプトがあり、印刷されたテキストを変更したい場合は、出力バッファリングを使用できます。

ob_start();
/*
 * Lots of php code
*/

$maintext = ob_get_clean(); // now you capture the content in $maintext 

// than you modify the output
$maintext = preg_replace("#\[%(.{1,20})%\]#", "display_products($1)", $maintext);
echo $maintext;
于 2012-07-18T09:18:07.010 に答える