Php 正则表达式:preg_replace_回调使用了错误的语法?

Php 正则表达式:preg_replace_回调使用了错误的语法?,php,regex,templating,preg-replace-callback,Php,Regex,Templating,Preg Replace Callback,我从这个链接中借用了代码来实现一种将值应用到模板函数的方法。这将使用preg_replace_callback()函数 我首选的命名方法是name1.name2.name3=value,而不是name1\u name2\u name3=value,但是我使用的正则表达式似乎有问题 这个不行 模板文件 .aclass{ font-width:{{newsflash.font.width}}; } .ini值 newsflash.font.width=8px Array ( [0] =&

我从这个链接中借用了代码来实现一种将值应用到模板函数的方法。这将使用preg_replace_callback()函数

我首选的命名方法是name1.name2.name3=value,而不是name1\u name2\u name3=value,但是我使用的正则表达式似乎有问题

这个不行

模板文件

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

newsflash.font.width=8px
Array
(
  [0] => {{newsflash.font.width}}
  [1] => newsflash
)
使用正则表达式

'!\{\{(\w+).+\.\w+\}\}!'
打印输出($matches)

替换错误,因为$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>";
.ini文件的内容


字符
不是
\w
的一部分;您的
+
(分组参数之外)将匹配任何非空字符串(
为通配符)。因此,
$matches[1]=newsflash
是正确的

您认为,
$matches[1]
将成为什么?你的问题不清楚,对不起


此regexp似乎与模板匹配良好。

匹配数组似乎正确。。。你能打个替换回拨电话吗?你希望结果是什么?我明白你的意思,我希望匹配[1]是newsflash.font.width,在英语中,它应该是一个没有点的单词,或者是一个结尾有点的单词序列,然后是一个没有点的单词。在这种情况下,使用
\{\{((?:\w+\)*\w+\}}some..junk
)匹配,则将其作为正则表达式。此外,如果您不关心匹配[2]元素的存在,则可以省略
?:
。您的示例工作得非常好。“?:”?
(?:…)
的意义与(…)类似,只是括号不会在matches数组中创建元素(在本例中为matches[2])。需要()以便*将重复点和单词。
.aclass{
  font-width:{{newsflash.font.width}};
  color:{{newsflash.font.color}}
}
newsflash.font.width=8px
newsflash.font.color=red
!\{\{(\w[\.\w]*)\}\};?!