代替タグですがPHPとRegExps
-
05-09-2019 - |
質問
私は読み取りが必要になり、文字列を検出する{VAR},そのfile_get_contents('VAR.php')の場{VAR}.の"VAR"を提供するもののように、試験までお気軽にお問合せ-書、等。いかVARとがないようにハードコーディングの条件でだけ、大文字英数字のタグに囲まれ巻きブレースだけでなfile_get_contents()を負荷します。
思いを利用する必要がpreg_matchとpreg_replaceが、私は障害のRegExps。
どのようにこの便利なのでしょう?にこに引っ掛けWordPressなのです。
解決
オリオンは、上記の適切なソリューションを持っているが、それはあなたの簡単な場合には、コールバック関数を使用することが本当に必要はありません。
ファイル名を使用すると、正規表現でのPHPの/ Eフラグを使用して1行でそれを行うことができます-Z +ハイフンであることを仮定します:
$str = preg_replace('/{([-A-Z]+)}/e', 'file_get_contents(\'$1.html\')', $str);
これはVAR.htmlの内容{VAR}の任意のインスタンスを置き換えます。あなたが特定のディレクトリを指定する必要がある場合には、第二項にパスを前に付けることができます。
があり上記で概説したように同じ漠然としたセキュリティの心配がありますが、私は特定の何も考えていないことができます。
他のヒント
する必要がありませたらいいなと思うことはたくさん.いときの足のページにしたいデータを前処理に文字列になります。
最初にする必要がありました正規表現に合わせます。るべきかなりやすいように
/{\w+}/
.次にする必要がありま使用のすべてのフラグをpreg_matchのオフセット位置、ページデータです。このオフセットだけの文字列を、マッチング、後部のせんでした。
一度に3つの部品だけを実行する必要があごなど、貼す。
泡立、リンス、繰り返す。
停きな変数です。
日本にはものすごく効率的があります。が大きく異なるため別途ご相談承ってpreg_split代わりに、分割に /[{}]/
.どこを切ってもよいだと仮定するときに信頼をお受信データを、この単純化のプロセス全体ます。このためにも、今までの高いレイアウトができるでしょうコードのように:
Takeコンテンツ分割ではこのように:
$parts = preg_split('/[{}]/', $page_string);
書き再帰関数の部品は、以下の基準を
- 停止時の長さのargは < 3
- 他に戻って新しい配列の構成
- $arg[0]になります。load_data($arg[1]).$arg[2]
- プラスも残さ$argv[3...]
お客様の機能ドパーツ。
あなたは(神禁止)、のようなもの正規表現せずにそれを行うことができます
//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...
}
}
トップを切ったいこの:
// 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
現在についてご説明させていただき、regex
\{([-A-Z]+)\}
- の
\{
や\}
私も合わせ、巻きブレース.必要なものにスラッシュとして{
や}
特殊文字は、その必要とすること。 - の
(
や)
作成中の分類.基本的にことができます抽出物の特定部分間戦いました。私はその機能の上だけのものブレース、マッチングのブレース。わなかった場合は、そのためのストリップ{
や}
の試合は、迷惑 - の
[-A-Z]
"と合わせ大文字、または-
- の
+
後の[-A-Z]
手段として少なくとも1文字ができていませ。
比較的に言えば、正規表現は高価です。あなたがロードするファイルを見つけ出すために必要になる場合がありますが、あなたは確かに置き換えることのためにそれらを必要としない、そしておそらく正規表現を使用しないでください。結局のところ、あなたはあいまい検索が必要なのか、なぜそんなに交換する正確に何を知っていますか?
あなたの交換を行うことを連想配列とstr_replaceを使用してください。 str_replaceは、一度に複数の置換を行うための配列をサポートしています。一行置換、無ループます。
例
$substitutions = array('{VAR}'=>file_get_contents('VAR.php'), '{TEST}'=>file_get_contents('TEST.php'), ... ); $outputContents = str_replace( array_keys($substitutions), $substitutions, $outputContents);