0

このリンク PHP regex templating からコードを借用しました- {{var}} のすべての出現箇所を見つけて、テンプレート ファイルに値を適用する手段を実装します。これは preg_replace_callback() 関数を使用します

私の好みの命名方法は、name1_name2_name3=value ではなく、name1.name2.name3=value ですが、使用している正規表現には問題があるようです。

これは機能しません。

テンプレートファイル

.aclass{
  font-width:{{newsflash.font.width}};
}

.ini 値

newsflash.font.width=8px

使用される正規表現

'!\{\{(\w+).+\.\w+\}\}!'

print_r($matches) の出力

Array
(
  [0] => {{newsflash.font.width}}
  [1] => newsflash
)

$matches[1] が間違ったキーキーであるため、置換が間違っています。

.aclass{
  font-width:;
}

この機能を既に提供しているライブラリがあり、それらについて知りたいと思っていますが、それでも正規表現の欠点を知りたいです。

不完全な正規表現を含むフルコードを以下に示します。

$inputFileName = 'templateVars.css';
$outputFileName = 'templateVals.css';
$varsFileName = 'variables.ini';

$ini_array = parse_ini_file($varsFileName);
$matchesArray = array();

function replace_value($matches) {
  global $ini_array;
  global $matchesArray;
  print "<pre>";
  print_r($matches);
  print "</pre>";
  return $ini_array[$matches[1]];
}


$inputFileVar = file_get_contents($inputFileName);

print "<pre>";
print_r($ini_array);
print "</pre>";


print "<pre>";
print $inputFileVar;
print "</pre>";

$outFileVar = preg_replace_callback('!\{\{(\w+).+\.\w+\}\}!', 'replace_value', $inputFileVar);

print "<pre>";
print $outFileVar;
print "</pre>";

print "<pre>";
print $matchesArray;
print "</pre>";

照合するテンプレート

.aclass{
  font-width:{{newsflash.font.width}};
  color:{{newsflash.font.color}}
}

.ini ファイルの内容

newsflash.font.width=8px
newsflash.font.color=red
4

2 に答える 2

1

文字.は の一部ではありません\w。あなたの.+(グループ化括弧の外側)は、空でない文字列(.ワイルドカードです)と一致します。したがって、$matches[1]=newsflash正しいです。

あなたは何$matches[1]になりたいですか?これはあなたの質問からは明らかではありません、申し訳ありません。

于 2009-09-12T20:10:49.637 に答える
0
!\{\{(\w[\.\w]*)\}\};?!

この正規表現は、テンプレートとうまく一致しているようです。

于 2009-09-12T21:58:17.933 に答える