Regex: sintaxe defeituosa usado com preg_replace_callback?
-
06-07-2019 - |
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
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.