IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Une regex de plus [RegEx]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Une regex de plus
    Bonjour,

    Voilà, j'ai pas l'habitude de poster, mais là ça fait vraiment longtemps que cherche sur le web, le/les forums, etc, sans résultat... ^^
    J'en viens donc à solliciter votre aide. =)

    Bon !
    Mon problème : Je souhaite faire un preg_replace sur une chaîne qui nous vient directement d'un code source. De ce type :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <td id="2-5" style="padding:0px;width:30px;height:30px;background:url(maps/2_petit_couloir/2-5.jpg);" onClick="propriete_case='';type='';test(this.id)"></td>

    Je travaille donc sur UNE ligne venant du fichier source et je souhaite modifier une partie de ce code par une expression regulière en php, de cette façon :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $a_editer='/onClick=".*">/i'; //la regex qui va trouver ce que je veux changer
    $editer='onClick="test()">'; //ce que je veux y mettre

    Je souhaite donc pouvoir changer tout ce qui peut se trouver dans l'attribut onClick...

    Dans mon code, j'en viens à faire ceci, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace($a_editer,$editer,$line);
    Où $line est la ligne source à editer du type donné au-dessus.

    Donc, ce devrait être tout bête, mais ma regex marche pas !
    en faisant simplement
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $a_editer='/onClick.*/i';
    ça marche, mais ça va trop loin, évidement, cela va jusqu'à la fin de la ligne ; et puisque j'aimerais que ça s'arrête à la première balise de fermeture qu'elle rencontre, je devrais lui dire de s'arrêter à ceci : > ; mais ça ne veut pas ! lol
    Est-ce dû aux caractères contenu dans le code source, au fait de lui dire de tout prendre (.*) jusque (>)... Ce me semblait être une regex toute bête, mais j'avoue que là je comprend pas ! ^^
    J'ai fait des tonnes de tests, mais il semble que dès que je lui demande de chercher des symboles du genre >,<,ou ", ça ne veut plus marcher... même avec les \ devant ! ou entre crochets aussi ... je bloc !

    Si vous avez une idée, une solution ? Je vous en remercierais d'avance !

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    C'est sûrement dû au caractère greedy (gourmand) de l'expression .*

    Tu peux utiliser ceci qui est plus sélectif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '/onClick="[^"]*"/i';
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Il ne veut rien savoir non plus.
    Cela réagit comme s'il ne trouvait tout simplement pas l'expression...
    Il n'effectue donc aucun changement sur la chaîne... =(

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je crois que je vais vous présenter mon code (qui n'en est qu'au début) au complet pour la mise en situation :
    Voici :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    if (isset ($_GET['map'])){
    	include ($_GET['map']);
     
    	$nb_ligne=0;
     
    	$id='2-5';//à recevoir depuis un autre script. (Celui-ci s'utilisera d'ailleurs en fonction...).
     
    	$id_a_trouver='/'.$id.'/';
     
    	$a_editer='/onClick="[^"]*"/i';//Ceci aussi variera selon les demandes... pré-établies, évidement, avec des if...
    	$editer='onClick="test()">';
     
    	$fmap=fopen($_GET['map'],"r+");
     
    	while($line=fgets($fmap)){
    		$nb_ligne++;
    		if (preg_match($id_a_trouver,$line)){
    			echo 'Le code source de la case <strong>'.$id.'</strong> se trouve à la ligne <strong>'.$nb_ligne.'</strong>.<br/>';
    			echo 'Voici le code de la ligne :<br/>';
    			echo htmlspecialchars($line);
    			echo '<br/><br/>';
     
    			echo preg_replace($a_editer,$editer,htmlspecialchars($line));
     
    			break;
    		}
    	}
    	fclose($fmap);
    }

    Je sais pas si ça peut aider...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ainsi, sans voir à travailler sur le code en lui-même, mon problème est vraiment la regex !
    Puisque le but final de ce code est :

    - On inclus le fichier source dans la page (affichage d'origine);
    - On voit à modifier les attributs onClick des cases (car c'est un tableau);
    - On inscrit les changements effectués dans le fichier (pour sauvegarde);

    Et cette regex est donc la clef puisqu'elle va me permettre de changer, voir à plusieurs reprises, tout ce qui pourrait être contenu dans l'attribut onClick ...

    Voili ! ...
    Je pensais vraiment pas avoir autant de mal à réaliser cela ! (la regex ! lol )

  6. #6
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    La chaîne de remplacement ($editer) va ajouter un ">" qui n'est pas souhaité à mon avis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $a_editer='/onClick="[^"]*"/i';
    $editer='onClick="test()">';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace($a_editer,$editer,htmlspecialchars($line));
    Tu devrais plutôt appliquer htmlspecialchars au retour de preg_replace plutôt qu'à l'entrée.

    A part ça, le pattern de jml94 me paraît correct

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    CA Y'EST !!!

    Ca marche ! lol

    Merci beaucoup pour vos lumières !

    C'était bien cela goodpz : il fallait appliquer le htmlspecialchars au retour par variable (chose importante) de preg_replace plutôt que directement à l'entrée.

    Merci encore !

    Voici donc ce que j'ai fait (pour ceux qui voudraient voir, qui en auraient besoin) :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $a_editer='/onClick="[^"]*"/i'; //La regex de recherche
    $editer='onClick="test()"'; //Le changement souhaité
     
    //Puis dans la boucle, j'en viens à appliquer tout ceci :
    $test=preg_replace($a_editer,$editer,$line); //Dans la variable $test, le changement appliqué sur la chaîne stockée dans $line
    echo htmlspecialchars($test); //Puis on fait ce que l'on veut du résultat ^^

    Mon problème était donc le htmlspecialchars

    Bonne continuation à vous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] php et javascript dans une regex
    Par grochenel dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2005, 22h21
  2. [RegEx] spliter par rapport a une regex en récuperant la regex
    Par Khrysby dans le forum Langage
    Réponses: 1
    Dernier message: 10/11/2005, 15h08
  3. Réponses: 2
    Dernier message: 20/06/2005, 11h46
  4. [Thread]run une fois et plus apres
    Par maxvador dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 29/12/2004, 15h31
  5. Une colonne en plus dans ma ListView...
    Par James_ dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/09/2003, 23h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo