Regex: fehlerhafte Syntax mit preg_replace_callback verwendet?
-
06-07-2019 - |
Frage
Ich habe Code aus diesem Link PHP Regex Templating entlehnt - finden alle Vorkommen von {{var}} ein Mittel zur Anwendung Werte Vorlage-Datei an implementieren. Dies verwendet die preg_replace_callback () Funktion
meine bevorzugte Methode der Namensgebung ist name1.name2.name3 = Wert, anstatt name1_name2_name3 = Wert, aber die regex Ich bin mit scheint ein Problem zu haben.
Dies funktioniert nicht.
Template-Datei
.aclass{
font-width:{{newsflash.font.width}};
}
ini-Werte
newsflash.font.width=8px
regex verwendet
'!\{\{(\w+).+\.\w+\}\}!'
Ausgabe von print_r ($ matches)
Array
(
[0] => {{newsflash.font.width}}
[1] => newsflash
)
Substitution ist falsch, weil $ treffer [1] ist eine falsche Taste drücken.
.aclass{
font-width:;
}
Ich vermute, es gibt Bibliotheken, die bereits diese Funktionalität bereitstellen und würde gerne über sie wissen, aber ich will noch die Störung mit der Regex kennen.
Die fullcode mit dem fehlerhaften regex ist unten.
$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 gelegt werden,
.aclass{
font-width:{{newsflash.font.width}};
color:{{newsflash.font.color}}
}
Inhalt der INI-Datei
newsflash.font.width=8px
newsflash.font.color=red
Lösung
das Zeichen .
ist nicht Teil der \w
; und Ihre .+
(außerhalb der Gruppierung Pars) passt auf jede nicht leere Zeichenkette (.
ist Wildcard). Daher $matches[1]=newsflash
korrekt ist.
Was tun Sie wnat der $matches[1]
zu sein? Dies ist nicht klar, aus Ihrer Frage, sorry.
Andere Tipps
!\{\{(\w[\.\w]*)\}\};?!
diese regexp scheint Ihre Vorlagen gut zu entsprechen.