Question

J'ai emprunté du code à ce lien créer un modèle PHP regex - tout trouver occurrences de {{var}} pour implémenter un moyen d'appliquer des valeurs aux modèles de fichier. Ceci utilise la fonction preg_replace_callback ()

ma méthode de dénomination préférée est nom1.nom2.nom3 = valeur plutôt que nom1_nom2_nom3 = valeur, mais l'expression rationnelle que j'utilise semble avoir un problème.

Celui-ci ne fonctionne pas.

fichier de modèle

.aclass{
  font-width:{{newsflash.font.width}};
}

Valeurs .ini

newsflash.font.width=8px

expression régulière utilisée

'!\{\{(\w+).+\.\w+\}\}!'

sortie de print_r ($ correspond)

Array
(
  [0] => {{newsflash.font.width}}
  [1] => newsflash
)

la substitution est incorrecte car $ matches [1] est une clé incorrecte.

.aclass{
  font-width:;
}

Je soupçonne que certaines bibliothèques fournissent déjà cette fonctionnalité et aimeraient bien en savoir plus à ce sujet, mais je veux tout de même savoir quelle est la faute dans la regex.

Le code complet avec l'expression rationnelle défectueuse est ci-dessous.

$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>";

Modèle à faire correspondre

.aclass{
  font-width:{{newsflash.font.width}};
  color:{{newsflash.font.color}}
}

Contenu du fichier .ini

newsflash.font.width=8px
newsflash.font.color=red
Était-ce utile?

La solution

le caractère . ne fait pas partie de \ w ; et votre . + (en dehors des parenthèses de regroupement) correspondra à toute chaîne non vide (. est un caractère générique). Par conséquent, $ match [1] = newsflash est correct.

Que voulez-vous que le $ correspond à [1] ? Cela ne ressort pas clairement de votre question, désolé.

Autres conseils

!\{\{(\w[\.\w]*)\}\};?!

cette expression rationnelle semble correspondre parfaitement à vos modèles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top