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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top