Regex: sintassi difettosa utilizzata con preg_replace_callback?
-
06-07-2019 - |
Domanda
Ho preso in prestito il codice da questo link PHP regex templating - trova tutto occorrenze di {{var}} per implementare un mezzo per applicare valori ai template template. Questo utilizza la funzione preg_replace_callback ()
il mio metodo preferito di denominazione è name1.name2.name3 = value, piuttosto che name1_name2_name3 = value, ma la regex che sto usando sembra avere un problema.
Questo non funziona.
file modello
.aclass{
font-width:{{newsflash.font.width}};
}
.ini valori
newsflash.font.width=8px
regex usato
'!\{\{(\w+).+\.\w+\}\}!'
output di print_r ($ corrispondenze)
Array
(
[0] => {{newsflash.font.width}}
[1] => newsflash
)
La sostituzione è errata perché $ match [1] è chiave chiave errata.
.aclass{
font-width:;
}
Sospetto che ci siano librerie che già forniscono questa funzionalità e mi piacerebbe conoscerle, ma voglio ancora conoscere l'errore con la regex.
Il codice completo con regex difettoso è inferiore.
$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>";
Modello da abbinare
.aclass{
font-width:{{newsflash.font.width}};
color:{{newsflash.font.color}}
}
Contenuto del file .ini
newsflash.font.width=8px
newsflash.font.color=red
Soluzione
il carattere .
non fa parte di \ w
; e il tuo . +
(al di fuori delle parentesi di raggruppamento) corrisponderà a qualsiasi stringa non vuota (.
è un carattere jolly). Pertanto, $ match [1] = newsflash
è corretto.
Che cosa vuoi che sia $ match [1]
? Questo non è chiaro dalla tua domanda, scusa.
Altri suggerimenti
!\{\{(\w[\.\w]*)\}\};?!
questa regexp sembra corrispondere perfettamente ai tuoi modelli.