Problème Regex - PHP - simple quote

Fermé
Apa - 13 août 2012 à 11:19
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 13 août 2012 à 12:56
Bonjour,

J'ai besoin d'une expression régulière qui détecte des balises HTML, de type :
<balise class='toto' id='tata'> *élément(s) recherché(s)* </balise>
J'ai donc laissé en dure les balises HTML dans ma regex ; ce qui donne :
$regex = "#<balise class='toto' id='tata'>(.{0,})</balise>#";
Le problème c'est que regex n'a pas l'air d'aimer les simples quotes : '
Dés que j'en met, regex ne détecte plus rien, même en mes inhibant (au cas ou) \'

Avez vous une solution pour placer une simple quote dans une regex ?

Merci
A voir également:

3 réponses

Guillaume Ki Messages postés 8 Date d'inscription lundi 13 août 2012 Statut Membre Dernière intervention 13 août 2012
13 août 2012 à 11:46
<balise class='toto' id='tata'> ([^<]+) </balise>

les ' simple quote ne change rien. ^^
[^<]+ équivaut à: accepte tous sauf '<'
en le faisant suivre de < comme ca ([^<]+) < équivaut à prendre tout jusqu'au <
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 13/08/2012 à 12:01
Guillaume Ki-: Il faudrait supprimer les espaces que tu as mis de part et d'autre des parenthèses, car ils supposent qu'il existent dans le contenu.

Apa: ton expression est bonne également. J'aurai écrit plus simplement (.*), mais peu importe.

Cela dit, elle ne va fonctionner que si le contenu est sur une seule ligne.

Pour matcher sur plusieurs lignes, ajoute le modificateur 's', qui traitera les différentes lignes comme s'il s'agissait d'une seule :

$regex = "#<balise class='toto' id='tata'>(.{0,})</balise>#s";

S'il y a plusieurs tags à matcher, tu peux aussi ajouter le modificateur 'g'.

Enfin, si ce que tu veux c'est supprimer les tags html, il y a une fonction php pour cela (qui a ses limites, cf. la doc) : https://www.php.net/manual/en/function.strip-tags.php

Elle est paramétrable sur les tags concernés.


Dal
0
Guillaume Ki Messages postés 8 Date d'inscription lundi 13 août 2012 Statut Membre Dernière intervention 13 août 2012
13 août 2012 à 12:20
En l'occurrence les espaces sont de part et d'autres de l'exemple:
"<balise class='toto' id='tata'> *élément(s) recherché(s)* </balise>"
Oops je joue l'idiot o.O


"J'aurai écrit plus simplement (.*), mais peu importe. "
Je suis pas exactement d'accord. Je dirais théoriquement oui vu que PCRE contrairement à POSIX cherche à retourner la réponse la plus courte mais il m'est arrivé un bon paquet de fois que ça ne le fasse pas aussi j'ai été content de découvrir l'exclusion. Il comprend mieux quand tu lui dis clairement j'en veux pas.

Du coup pour moi ca donne:

$regex = "#<balise class='toto' id='tata'>([^<]+)</balise>#s";

Mais ca m'étonnerait que tu aies plusieurs balises avec le même id ("tata").
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
13 août 2012 à 12:56
Cela parait être un bon moyen d'écrire une expression plus portable. Peut-être est-elle aussi plus rapide :-)

J'aurai aussi proposé ([^<]*), pour matcher le cas où la balise existe, mais ne contient rien.
0
Merci beaucoup Dal !

En fait ce que je veux faire est un peu plus compliqué, il faut que je stocke en base de donnée les informations placées dans certaines balises pour faire des statistiques.

Merci pour ta Regex, je ne connaissais pas ces options, mais cela fonctionne parfaitement bien :)
0