Question

Je dois lire une chaîne, détecter un {VAR}, puis faire un file_get_contents ( 'VAR.php') à la place de {VAR}. Le « VAR » peut être nommé quoi que ce soit, comme test ou formulaire de contact, etc. Je ne veux pas savoir ce que VAR est - ne pas faire une condition codée en dur, mais pour voir juste une étiquette alphanumérique majuscule entouré accolades et il suffit de faire un file_get_contents () pour le charger.

Je sais que je dois utiliser preg_match et preg_replace, mais je suis trébuchant sur les expressions rationnelles à ce sujet.

Comment est-ce utile? Il est utile dans l'accrochage WordPress.

Était-ce utile?

La solution

Orion a une bonne solution ci-dessus, mais il est pas vraiment nécessaire d'utiliser une fonction de rappel dans votre cas simple.

Si l'on suppose que les noms de fichiers sont A-Z + vous pouvez le faire traits d'union en 1 ligne en utilisant le drapeau de PHP / e dans le regex:

$str = preg_replace('/{([-A-Z]+)}/e', 'file_get_contents(\'$1.html\')', $str);

va remplacer toute instance de {VAR} avec le contenu de VAR.html. Vous pouvez préfixer un chemin dans le second terme si vous avez besoin de spécifier un répertoire particulier.

Il y a les mêmes soucis de sécurité vagues comme celles indiquées ci-dessus, mais je ne peux pas penser à quelque chose de spécifique.

Autres conseils

Vous aurez besoin de faire un certain nombre de choses. Je suppose que vous pouvez faire le travail sur le terrain pour obtenir les données de page que vous souhaitez prétraiter dans une chaîne.

  1. D'abord, vous aurez besoin de l'expression régulière pour correspondre correctement. Cela devrait être assez facile avec quelque chose comme /{\w+}/.

  2. Ensuite, vous aurez besoin d'utiliser tous les drapeaux à preg_match pour obtenir l'emplacement de décalage dans les données de la page. Ce décalage vous permettra de diviser la chaîne dans le avant, la correspondance, et après les parties du match.

  3. Une fois que vous avez les 3 parties, vous devrez gérer votre inclure, et les coller ensemble.

  4. Lather, rincer, répéter.

  5. Arrêtez-vous lorsque vous ne trouvez pas plusieurs variables.

Ce n'est pas très efficace, et il y a probablement de meilleures façons. Vous voudrez peut-être envisager de faire une place preg_split, le fractionnement sur /[{}]/. Peu importe la façon dont vous coupez vous êtes en supposant que vous pouvez faire confiance à vos données entrantes, ce qui simplifiera le processus beaucoup. Pour ce faire, je mets le code comme ceci:

  1. Prenez votre contenu et diviser comme ceci: $parts = preg_split('/[{}]/', $page_string);

  2. Ecrire une fonction récursive sur les parties avec les critères suivants:

    • Halt lorsque la longueur de arg est <3
    • Sinon, retourner un nouveau tableau composé de
    • arg $ [0]. load_data ($ arg [1]). arg $ [2]
    • plus ce qui reste dans $ argv [3 ...]
  3. Exécuter votre fonction sur les parties $.

Vous pouvez le faire sans regexes (à Dieu ne plaise), quelque chose comme:

//return true if $str ends with $sub
function endsWith($str,$sub) {
    return ( substr( $str, strlen( $str ) - strlen( $sub ) ) === $sub );
}

$theStringWithVars = "blah.php cool.php awesome.php";
$sub = '.php';
$splitStr = split(" ", $theStringWithVars);
for($i=0;$i<count($splitStr);$i++) {
    if(endsWith(trim($splitStr[$i]),$sub)) {
        //file_get_contents($splitStr[$i]) etc...
    }    
}

Du haut de ma tête, vous voulez ceci:

// load the "template" file
$input = file_get_contents($template_file_name);

// define a callback. Each time the regex matches something, it will call this function.
// whatever this function returns will be inserted as the replacement
function replaceCallback($matches){
  // match zero will be the entire match - eg {FOO}. 
  // match 1 will be just the bits inside the curly braces because of the grouping parens in the regex - eg FOO
  // convert it to lowercase and append ".html", so you're loading foo.html

  // then return the contents of that file.
  // BEWARE. GIANT MASSIVE SECURITY HOLES ABOUND. DO NOT DO THIS
  return file_get_contents( strtolower($matches[1]) . ".html" );
};
// run the actual replace method giving it our pattern, the callback, and the input file contents
$output = preg_replace_callback("\{([-A-Z]+)\}", replaceCallback, $input);

// todo: print the output

Maintenant, je vais vous expliquer l'expression rationnelle

 \{([-A-Z]+)\}
  • Le \{ et \} disent juste pour faire correspondre les accolades. Vous avez besoin des barres obliques sont des caractères spéciaux { et }, ils ont donc besoin échapper.
  • Le ( et ) créer un groupe. En gros, cela vous permet d'extraire certaines parties du match. Je l'utilise dans la fonction ci-dessus pour correspondre à peu les choses à l'intérieur des accolades, sans correspondre les accolades. Si je ne le fais pas, alors je dois dépouiller les { et } hors du match, ce qui serait gênant
  • Le [-A-Z] dit « correspond à tout caractère majuscule, ou un -
  • Le + après le [-A-Z] signifie que nous devons avoir au moins 1 caractère, mais nous pouvons avoir jusqu'à un nombre.

En comparaison, l'expression régulière sont chers. Alors que vous pouvez avoir besoin de savoir quels sont les fichiers à charger, vous ne avez certainement pas besoin d'eux pour faire le remplacer, et ne devrait probablement pas utiliser des expressions régulières. Après tout, vous savez exactement ce que vous remplacez alors pourquoi avez-vous besoin de recherche floue?

Utilisez un tableau associatif et str_replace pour faire vos remplacements. str_replace supporte des tableaux pour faire des substitutions multiples à la fois. Une substitution de la ligne, pas de boucles.

Par exemple:

$substitutions = array('{VAR}'=>file_get_contents('VAR.php'),
'{TEST}'=>file_get_contents('TEST.php'),
...
);

$outputContents = str_replace( array_keys($substitutions), $substitutions, $outputContents);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top