Regex: неправильный синтаксис, используемый с preg_replace_callback? - PullRequest
0 голосов
/ 13 сентября 2009

Я заимствовал код из этой ссылки Шаблон регулярных выражений PHP - найдите все вхождения {{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 ($ соответствует)

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

подстановка неправильная, потому что $ совпадения [1] - неправильный ключ.

.aclass{
  font-width:;
}

Я подозреваю, что есть библиотеки, которые уже предоставляют эту функциональность и хотели бы узнать о них, но я все еще хочу знать, в чем ошибка с регулярным выражением.

Полный код с неисправным регулярным выражением приведен ниже.

<code>$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 "
"; return $ ini_array [$ match [1]]; } $ inputFileVar = file_get_contents ($ inputFileName); печать "
";
print_r($ini_array);
print "
"; печать "
";
print $inputFileVar;
print "
"; $ outFileVar = preg_replace_callback ('! \ {\ {(\ w +). + \. \ w + \} \}!', 'replace_value', $ inputFileVar); печать "
";
print $outFileVar;
print "
"; печать "
";
print $matchesArray;
print "
";

Шаблон для сопоставления

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

Содержимое файла .ini

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

Ответы [ 2 ]

1 голос
/ 13 сентября 2009

символ . не является частью \w; и ваш .+ (за пределами группирующих паренов) будет соответствовать любой непустой строке (. - подстановочный знак) Следовательно, $matches[1]=newsflash является правильным.

Кем вы хотите быть $matches[1]? Это не ясно из вашего вопроса, извините.

0 голосов
/ 13 сентября 2009
!\{\{(\w[\.\w]*)\}\};?!

Похоже, это регулярное выражение подходит для ваших шаблонов

...