2009-02-10 10 views
0

Serait-il possible de faire une regex qui lit {variable} comme <?php echo $variable ?> dans les fichiers PHP?PHP Regex Question

Merci

Remy

+0

Qu'essayez-vous de faire exactement? –

+0

Je ne sais pas si c'est possible ou pas, mais ça semble être une mauvaise idée. N'importe qui d'autre qui regarde votre code n'aura aucune idée de ce qui se passe, et vos outils de développement ne le comprendront probablement pas non plus. – Misko

Répondre

0

{Pas vraiment une réponse, mais ont besoin d'éclaircissements}

Pourriez-vous votre question? Voulez-vous appliquer une regex au contenu de $ variable?

+0

Je veux pouvoir taper {variable} au lieu de . –

+0

@Suroot: Les commentaires sont habituellement utilisés pour ce type de questions :) – Ross

+0

@Ross: Suroot n'a pas assez de rep réssent pour poster des commentaires. :) –

0

La ligne suivante devrait remplacer toutes les occurrences de la chaîne « {variable} » avec la valeur de la variable globale $variable:

$mystring = preg_replace_callback(
    '/\{([a-zA-Z][\w\d]+)\}/', 
    create_function('$matches', 'return $GLOBALS[$matches[1]];'), 
    $mystring); 

Edit: Remplacer l'expression régulière ici par celui mentionné par Gumbo précisément attrape tous les noms de variables PHP possibles.

4

Le manuel PHP fournit déjà un regular expression for variable names:

[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* 

il vous suffit de le modifier à ceci:

\{[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\} 

Et vous avez terminé.


Modifier Vous devez être conscient que d'une simple replacment séquentielle de ces occurrences as Ross proposed peut entraîner des comportements indésirables lorsque, par exemple une substitution contient également des variables.

Donc vous devriez mieux analyser le code et remplacer ces variables séparément. Un exemple:

$tokens = preg_split('/(\{[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE); 
for ($i=1, $n=count($tokens); $i<$n; $i+=2) { 
    $name = substr($tokens[$i], 1, -1); 
    if (isset($variables[$name])) { 
     $tokens[$i] = $variables[$name]; 
    } else { 
     // Error: variable missing 
    } 
} 
$string = implode('', $tokens); 
+0

Je pense qu'il veut remplacer les balises php et aussi la fonction d'écho avec les accolades, pas seulement le signe dollar. – Misko

3

On dirait que vous essayez de faire un peu de remplacement variable de modèle;)

Je vous conseille de recueillir d'abord vos variables, dans un tableau par exemple, puis utiliser quelque chose comme:

// Variables are stored in $vars which is an array 
foreach ($vars as $name => $value) { 
    $str = str_replace('{' . $name . '}', $value, $str); 
} 
0

(in comments) Je veux être en mesure de taper {variable} au lieu de <?php echo $variable ?>

Approche primitive: Vous pouvez utiliser un programme externe (par ex. un script Python) pour prétraiter vos fichiers, ce qui rend la substitution regex suivante:

"{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)}" 

avec

"<?php echo $\g<1> ?>" 

Une meilleure approche: Ecrire une macro dans votre IDE ou éditeur de code pour effectuer automatiquement le remplacement de la toi.