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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top