0

文字列を読み取り、{VAR}を検出してから、{VAR}の代わりにfile_get_contents('VAR.php')を実行する必要があります。「VAR」には、TESTやCONTACT-FORMなど、任意の名前を付けることができます。VARが何であるかを知りたくありません。ハードコードされた条件を実行するのではなく、大文字の英数字タグを囲んで表示するだけです。中括弧で囲み、file_get_contents()を実行してロードします。

preg_matchとpreg_replaceを使用する必要があることはわかっていますが、これについてRegExpsを見つけています。

これはどのように役立ちますか?WordPressをフックするのに便利です。

4

5 に答える 5

1

上記のOrionには正しい解決策がありますが、単純なケースではコールバック関数を使用する必要はありません。

ファイル名がAZ+ハイフンであると仮定すると、正規表現でPHPの/eフラグを使用して1行で実行できます。

$str = preg_replace('/{([-A-Z]+)}/e', 'file_get_contents(\'$1.html\')', $str);

これにより、{VAR}のインスタンスがVAR.htmlのコンテンツに置き換えられます。特定のディレクトリを指定する必要がある場合は、2番目の用語の前にパスを付けることができます。

上で概説したのと同じ漠然としたセキュリティ上の懸念がありますが、私は具体的なことは何も考えられません。

于 2009-04-06T23:33:34.740 に答える
1

多くのことを行う必要があります。前処理したいページデータを文字列に取得するために、足を踏み入れることができると思います。

  1. まず、正しく一致する正規表現が必要です。のようなものでかなり簡単なはずです/{\w+}/

  2. 次に、すべてのフラグを preg_match に使用して、ページ データ内のオフセット位置を取得する必要があります。このオフセットにより、文字列を一致の前、一致、および後の部分に分割できます。

  3. 3 つの部分を取得したら、インクルードを実行して、それらを元に戻す必要があります。

  4. 泡立てて、すすぎ、繰り返します。

  5. 変数が見つからなくなったら停止します。

これはあまり効率的ではなく、おそらくもっと良い方法があります。代わりに preg_split を実行して、上で分割することを検討することをお勧めし/[{}]/ます。どのようにスライスしても、受信データを信頼できると想定しているため、プロセス全体が大幅に簡素化されます。これを行うには、次のようにコードをレイアウトします。

  1. コンテンツを取得して、次のように分割します。$parts = preg_split('/[{}]/', $page_string);

  2. 次の基準でパーツに再帰関数を記述します。

    • arg の長さが 3 未満の場合に停止します
    • そうでなければ、以下で構成される新しい配列を返します
    • $arg[0] . load_data($arg[1]) . $arg[2]
    • プラス $argv[3...] に残っているものは何でも
  3. $parts に対して関数を実行します。

于 2009-04-06T21:03:32.930 に答える
0

比較すると、正規表現は高価です。ロードするファイルを特定するためにそれらが必要になる場合がありますが、置換を行うためにそれらは確かに必要ではなく、おそらく正規表現を使用するべきではありません。結局のところ、何を置き換えるのかを正確に知っているのに、なぜあいまい検索が必要なのですか?

連想配列とstr_replaceを使用して置換を行います。str_replaceは、一度に複数の置換を行うための配列をサポートします。1行の置換、ループなし。

例えば:

$substitutions = array('{VAR}' => file_get_contents('VAR.php')、
'{TEST}' => file_get_contents('TEST.php')、
..。
);

$ outputContents = str_replace(array_keys($substitutions)、$substitutions、$ outputContents);
于 2009-04-06T23:55:32.597 に答える
0

私の頭の上から、あなたはこれが欲しい:

// load the "template" file
$input = file_get_contents($template_file_name);

// define a callback. Each time the regex matches something, it will call this function.
// whatever this function returns will be inserted as the replacement
function replaceCallback($matches){
  // match zero will be the entire match - eg {FOO}. 
  // match 1 will be just the bits inside the curly braces because of the grouping parens in the regex - eg FOO
  // convert it to lowercase and append ".html", so you're loading foo.html

  // then return the contents of that file.
  // BEWARE. GIANT MASSIVE SECURITY HOLES ABOUND. DO NOT DO THIS
  return file_get_contents( strtolower($matches[1]) . ".html" );
};
// run the actual replace method giving it our pattern, the callback, and the input file contents
$output = preg_replace_callback("\{([-A-Z]+)\}", replaceCallback, $input);

// todo: print the output

次に、正規表現について説明します

 \{([-A-Z]+)\}
  • そして\{\}中かっこに一致するように指示するだけです。{}は特殊文字であるため、スラッシュが必要なので、エスケープする必要があります。
  • およびグループ化()作成します。基本的に、これにより、一致の特定の部分を抽出できます。上記の関数で使用して、中括弧自体を一致させずに、中括弧内のものだけを一致させます。これを行わないと、マッチから{andを削除する必要があり}、面倒です。
  • は、[-A-Z]「任意の大文字に一致するか、または-
  • +後に[-A-Z]は、少なくとも 1 文字が必要ですが、最大で任意の数の文字を含めることができます。
于 2009-04-06T21:08:16.447 に答える
0

次のような正規表現なしで実行できます(神は禁じられています):

//return true if $str ends with $sub
function endsWith($str,$sub) {
    return ( substr( $str, strlen( $str ) - strlen( $sub ) ) === $sub );
}

$theStringWithVars = "blah.php cool.php awesome.php";
$sub = '.php';
$splitStr = split(" ", $theStringWithVars);
for($i=0;$i<count($splitStr);$i++) {
    if(endsWith(trim($splitStr[$i]),$sub)) {
        //file_get_contents($splitStr[$i]) etc...
    }    
}
于 2009-04-06T21:07:13.953 に答える