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 回答