5

現在、次のような Web ページ テンプレートを検索して置換しています。

$template = <<<TEMP
<html>
<head>
<title>[{pageTitle}]</title>
</head>
[{menuA}]
[{menuB}]
[{bodyContent}]
</html>
<<<TEMP;

上記は別ファイルに置いてあります。

次に、私は:

$template = str_replace("[{pageTitle}]",$pageTitle,$template);
$template = str_replace("[{menuA}]",$menuA,$template);
$template = str_replace("[{menuB}]",$menuB,$template);
$template = str_replace("[{bodyContent}]",$bodyContent,$template);
//Some 10 more similar to the above go here.
echo $template;

問題は、上記のものと同じように合計で約 15 個あることです。

これを行うためのより良い/よりクリーンな/専門的な方法はありますか(検索と置換、または全体を別の方法で行います)。これは非常に面倒で専門的ではないと思います。

4

6 に答える 6

3

はい、置き換えたいものの配列と、置き換えるものを含む別の配列を定義できます。

$array1 = array("[{pageTitle}]", "[{menuA}]");
$array2 = array($pageTitle, $menuA);

$template = str_replace($array1 , $array2 , $template);
于 2013-04-25T11:58:40.703 に答える
2

ljubiccicaの回答を変更することにより。変数と値を使用して連想配列を作成し、それらを置き換えることができます。

$array=array(
        'pageTitle'=>$pageTitle,
        'menuA'=> $menuA,
        );

$addBrackets = function($a)
{
    return '[{'.$a.'}]';
};
$array1 = array_keys($array);
$array1 = array_map($addBrackets,$array1);

$array2 = array_values($array);

$template = str_replace($array1 , $array2 , $template);
于 2013-04-25T12:36:16.243 に答える
1

最善の方法は、SmartyTwigなどの既存のライブラリを使用することです。

独自のテンプレート ソリューションを展開する場合は、正規表現を使用できます。

// Just an example array
$values = array('pageTitle' => 'foo', 'menuA' => 'bar');
$offset = 0;
while(preg_match('/\[\{([a-zA-Z]+)\]\}/', $template, $matches, 
  PREG_OFFSET_CAPTURE, $offset)) {
    $varname = $matches[0][3];
    $value = isset($values[$varname]) ? $values[$varname] : "Not found!";
    $template = str_replace('[{'.$varname.'}]', $value, $template);
    $offset = $matches[1];
}

連想配列が気に入らない場合は、代わりにこれを行うことができます。

$value = isset($$varname)? $$varname : "Not found";

しかし、公開したくない変数を公開する可能性があるため、これはお勧めしません。

于 2013-04-25T12:08:21.367 に答える
0

正規表現を使用するのはどうですか。以下のようなもの:

   $matches = array();
    preg_match_all("/\[\{.*?\}\]/", $template, $matches);
    foreach ($matches[0] as $match){
    // this will replace the '[{','}]' braces as we don't want these in our file name
    $var = str_replace("[{", "", $match);
    $var = str_replace("}]", "", $var);
    // this should pull in the file name and continue the output
    $template = str_replace($match, $$var, $template);
    }

私はそれをテストしていませんが、この方法では、何を交換する必要があるかを知る必要はありませんか? たとえば、[{text}] タグの内容を $text に置き換えますか?

于 2013-04-25T12:07:48.177 に答える
0

このようなものが実際に機能することがわかりました:

    $foo = 'bar';
    $baz = 'foo';

    $test = 'Test [{foo}] and [{baz}]';

    $test1 = preg_replace("/\[{(.*?)}\]/e", "$$1", $test);
    $test2 = preg_replace_callback("/\[{(.*?)}\]/", function($v) use($foo, $baz)
            {
                return ${$v[1]};
            }, $test);
    var_dump($test1); //string 'Test bar and foo' (length=16)
    var_dump($test2); //string 'Test bar and foo' (length=16)

だからあなたの場合:

$template= preg_replace("/\[{(.*?)}\]/e", "$$1", $template);

編集:

変数が次のように設定されているかどうかを確認することもできます。

    $foo = 'bar';
    $baz = 'foo';

    $test = 'Test [{foo}] and [{baz}] or [{ble}]';

    $test1 = preg_replace("/\[{(.*?)}\]/e", "isset($$1) ? $$1 : '$$1';", $test);
    var_dump($test1); //string 'Test bar and foo or $ble' (length=24)
于 2013-04-25T12:34:56.917 に答える