2017-10-10 5 views
1

J'essaie d'utiliser des expressions régulières pour rechercher dans une chaîne, remplacer plusieurs valeurs et créer une URL. Je n'ai jamais utilisé regex (à partir de zéro) avant donc un peu coincé.PHP Regex preg_replace plusieurs valeurs entre parenthèses

La chaîne est comprise entre [parenthèses carrées] en tant qu'identifiant. J'ai essayé plusieurs approches - Je ne comprends pas comment structurer la méthode regex ou preg_replace pour pouvoir effectuer plusieurs remplacements, idéalement sans beaucoup de répétition des lignes regex, mais c'est la direction que j'essaie:

$string= '[mycode="gallery" type="single" id="1" data="only"]'; //INPUT 

    $string = preg_replace('/\mycode="(.*)"\]/', '$1/mycode"', $string); 
    $string = preg_replace('/\type="(.*)"\]/', 'mycode_$1.php', $string); 
    $string = preg_replace('/\id="(.*)"\]/', '?id=$1', $string); 
    $string = preg_replace('/\data="(.*)"\]/', '&data=$1', $string); 

en fin de compte à la sortie:

galerie/_mycode_single.php id = 1 & data = uniquement (avec le [] enlevé trop)

Je sais que cela ne fonctionne pas actuellement comme je le fais pas? connaître la méthode pour compiler les sorties des lignes multiples; Toute aide serait appréciée. Merci!

+0

Désolé, oui - la] Je pense que c'était une faute de frappe de la part des efforts antérieurs. Je n'ai pas utilisé preg_replace_callback avant - pouvez-vous élaborer? Je suppose que vous voulez utiliser cela pour obtenir le contenu des [] crochets en premier, avant de faire quoi que ce soit d'autre? – WWD

+0

En utilisant la réponse fournie ci-dessous - merci encore – WWD

Répondre

0

Vous allez devoir faire deux couches, d'abord tirez tout ce qui se trouve entre les [] puis remplacez les valeurs si nécessaire. Vous pouvez utiliser preg_replace_callback pour accomplir ceci.

$string= '[mycode="gallery" type="single" id="1" data="only"]'; 
echo preg_replace_callback('/\[([^\]]+)\]/', function($match) { 
    $string = preg_replace('/\h*mycode="([^"]+)"\h*/', '$1/mycode', $match[1]); 
    $string = preg_replace('/\h*type="([^"]+)"\h*/', 'mycode_$1.php', $string); 
    $string = preg_replace('/\h*id="([^"]+)"\h*/', '?id=$1', $string); 
    $string = preg_replace('/\h*data="([^"]+)"\h*/', '&data=$1', $string); 
    return $string; 
}, $string); 

Votre regex n'a pas fonctionné pour plusieurs raisons:

  1. Vos cordes ne se terminent pas avec ]
  2. backslashs en fuite regex ou créer des caractères meta, \d est un nombre \t est un onglet.
  3. Si la construction d'une URL que vous ne voulez pas une double citation dans la valeur retournée
  4. Vous devez également couper les grands et les espaces blancs de fin

Démo: https://3v4l.org/KDD0B

+0

Bravo, merci - votre solution a parfaitement fonctionné! – WWD