0

HTMLコードからPHP関数を呼び出し、関数の引数を埋める問題に直面しています。その後、関数の戻り値を含む HTML コードが出力されます。

例として:

PHPファイルのどこかに関数が定義されています

function html_field($type,$name,$value){ 
//some code here
return $out;
}
// or other example function
function boldme($text){
return "<b>$text</b>";
}

その後、内部にphp関数(タグなど)を含む文字列でhtml出力が生成されます

HTML 文字列:

$html = "<h1><label for="foo">{call~html_field("text","name","value")} </label><input type="text" name="foo" id="foo" /> </h1>"

また

$html = "<h1><label for="foo">{call~boldme("text")} </label><input type="text" name="foo" id="foo" /> </h1>"

ソリューションは次のように終了する必要があります。

$html = "<h1><label for="foo"><input type="text" name="name" ...> </label><input type="text" name="foo" id="foo" /> </h1>"

また

$html = "<h1><label for="foo"><b>text</b> </label><input type="text" name="foo" id="foo" /> </h1>"

この文字列をフィルタリングする必要があります...

注: テンプレートとテーマから収集された html データを含む文字列です。これらは、純粋な HTML を内部に含む未知のファイルです。

必要な機能を作成するために使用preg_replace_callbackしていましたが、上司のおかげですべてなくなりました.... !@#!

4

2 に答える 2

1

文字列を解析し、それに基づいて何らかの関数を呼び出す必要がある場合は、preg_replace_callback関数を使用できます。

このような何かがうまくいくはずです:

$html = "<p>{functionName('value1', 'value2')}</p>";

function contentParser($matches)
{   
    $function = $matches[1];
    $parameters = array_slice($matches, 2);

    return call_user_func_array($function, $parameters);
}

function functionName($valueA, $valueB)
{
    return "You called functionName with values " . $valueA . " and " . $valueB;
}

echo preg_replace_callback(
    "/\{(\w+)\([\"']([^\"']+)[\"'](?:, ?[\"']([^\"']+)[\"'])?\)\}/",
    "contentParser",
    $html);

これにより、次のように出力されます。

You called functionName with values value1 and value2

私の正規表現には大きな問題があることに注意してください。
(HTML 内の) 値を一重引用符または二重引用符 (" または ') で囲むことができ、それらを混在させることができます...これは、値でどちらも使用できない 2 番目の問題につながります (I don' t エスケープされたシーケンスをチェックします)。

値ラッパーとして 1 文字のみを使用する (もちろん、その文字を変更できます) より単純なパターンは次のとおりです。

"/\{(\w+)\(#([^#]+)#(?:, ?#([^#]+)#)?\)\}/"

ここでは値の区切り記号としてシャープ (#) を使用しています。HTML は次のようになります。

<p>{functionName(#value1#, #value2#)}</p>
于 2013-04-24T12:13:41.773 に答える
1

$htmlストリングスはどこから来たのですか?静的コードの場合は、標準の php を使用します。

$html = '<h1><label for="foo">' . html_field("text","name","value") . '</label><input type="text" name="foo" id="foo" /> </h1>';

それらがデータベースやファイルなどから読み込まれる場合は、次のオプションが必要です。

  • 独自のテンプレート エンジンの作成、多くの作業、バグの少なさ、時間の無駄
  • twigのような軽量のテンプレート エンジンを使用し、関数をフィルターとして定義します。
于 2013-04-24T12:03:49.587 に答える