Regex: неправильный синтаксис, используемый с preg_replace_callback?

StackOverflow https://stackoverflow.com/questions/1415988

Вопрос

Я заимствовал код по этой ссылке Шаблоны регулярных выражений 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:;
}

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

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

$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
Это было полезно?

Решение

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

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

Другие советы

!\{\{(\w[\.\w]*)\}\};?!

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top