Pergunta

Eu emprestado código a partir deste link PHP regex templates - Encontrar todos os ocorrências de {{var}} para implementar um meio de aplicação de valores para fiies modelo. Este usa a função preg_replace_callback ()

meu método preferido de nomeação é name1.name2.name3 = valor, em vez de name1_name2_name3 = valor, mas o regex Eu estou usando parece ter um problema.

Este não funciona.

arquivo de modelo

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

valores ini

newsflash.font.width=8px

regex usado

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

saída de print_r ($ matches)

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

substituição é errado, porque $ matches [1] é a chave tecla errada.

.aclass{
  font-width:;
}

Eu suspeito que há bibliotecas que já fornecem essa funcionalidade e gostariam de saber sobre eles, mas eu ainda quero saber a falha com a regex.

O fullcode com o regex com defeito está abaixo.

$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>";

Template a ser correspondido

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

Conteúdo do arquivo .ini

newsflash.font.width=8px
newsflash.font.color=red
Foi útil?

Solução

o . personagem não é parte de \w; e seu .+ (fora os parênteses de agrupamento) irá corresponder a qualquer cadeia não vazia (. é wildcard). Portanto, $matches[1]=newsflash está correto.

O que você wnat a $matches[1] ser? Este não é claro da sua pergunta, me desculpe.

Outras dicas

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

este regexp parece que coincidem com sua modelos bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top