Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/02/2007, 16h05   #1
Membre chevronné
 
Homme Jérémy
Étudiant
Inscription : mars 2005
Messages : 634
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2005
Messages : 634
Points : 710
Points : 710
Par défaut Supprimer balise



Petite question au sujet des expressions régulières. Pour l'écriture d'un parseur, je souhaite supprimer des balises <br /> qui se mettent dans une liste <ul> ou <ol>, ce qui rend le code html non valide.

Exemple :
Code html :
1
2
3
4
5
6
7
8
9
10
11
12
13
Valide :
<ul>
  <li>elem 1<br />test</li>
  <li>elem 2</li>
</ul>
 
Non Valide :
<ul>
<br />
  <li>elem<br />test</li>
  <li>elem</li>
  </br>
</ul>

J'ai trouvé l'expression régulière pour supprimer les <br />, mais comment faire pour ne les supprimer que dans les balises <ul>...</ul> ou <ol>...</ol> ? J'ai essayé plusieurs codes mais ça ne marche pas.

Code :
1
2
3
4
5
// Supprime tout les <br />
$text = preg_replace('`(^|\W)(<br />)(\W|$)`si','$1 $3', $text);
 
// Ne marche pas
$text = preg_replace('`<ul>(^|\W)(<br />)(\W|$)</ul>`si','$1 $3', $text);
__________________
Fiquet
- FAQ SDL
- FAQ C++
Fiquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 17h07   #2
Membre chevronné
 
Inscription : janvier 2006
Messages : 918
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 918
Points : 735
Points : 735
Il te faut utiliser le modificateur U (ungreedy) pour récupérer les balises une par une.
Essaye
Code :
$text = preg_replace(#(<ul>*)(<br />)(.*</ul>)`Usi','\\1 \\3', $text);
Idem pour <li>
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 17h25   #3
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Code :
$text = preg_replace('#(<ul.*)(<br />)(.*</ul>)#Usi','$1$3', $text);
Il manquait un dièse... Je crois...
De plus, je préfère "<ul.*" au cas où il y aurait une mention de style, de classe, etc...
Et pourquoi un espace en replacant $1 et $3 ?
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 17h35   #4
Membre chevronné
 
Homme Jérémy
Étudiant
Inscription : mars 2005
Messages : 634
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2005
Messages : 634
Points : 710
Points : 710
Citation:
Envoyé par guidav
Il te faut utiliser le modificateur U (ungreedy) pour récupérer les balises une par une.
Essaye
Code :
$text = preg_replace(#(<ul>*)(<br />)(.*</ul>)`Usi','\\1 \\3', $text);
Idem pour <li>
J'ai essayé avec ton code comme ceci (il manquait le ' et j'ai fermé avec #) :
Code :
1
2
$text = preg_replace('#(<ul>*)(<br />)(.*</ul>)`#','\\1 \\3', $text);
$text = preg_replace('#(<li>*)(<br />)(.*</li>)`#','\\1 \\3', $text);
Edit : même chose avec
Code :
$text = preg_replace('#(<ul.*)(<br />)(.*</ul>)#Usi','$1$3', $text);
__________________
Fiquet
- FAQ SDL
- FAQ C++
Fiquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 17h40   #5
Membre chevronné
 
Homme Jérémy
Étudiant
Inscription : mars 2005
Messages : 634
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2005
Messages : 634
Points : 710
Points : 710
En fait en mettant
Code :
1
2
$text = preg_replace('#(<ul.*)(<br />)(.*</ul>)#Usi','$1$3', $text);
$text = preg_replace('#(<li.*)(<br />)(.*</li>)#Usi','$1$3', $text);
Il m'affiche

Code html :
1
2
3
4
5
<ul>
<li>salut</li>
<li>adieu</li><br />
<li>manger</li><br />
</ul>]

Au lieu de
Code html :
1
2
3
4
5
<ul><br />
<li>salut</li><br />
<li>adieu</li><br />
<li>manger</li><br />
</ul>
Donc il y a une amélioration mais il ne remplace qu'un <br />. Comment en remplacer plusieurs ?
__________________
Fiquet
- FAQ SDL
- FAQ C++
Fiquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 17h42   #6
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Nous sommes bien d'accord que $text contient bien tout le code ?
Pas que la première ligne...
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 17h51   #7
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Nan, je crois savoir.

Notre regexp chope un <br /> et pense avoir fini.
Il faut trouver un truc pour qu'elle se répète.

Essaies juste ça :
Code :
1
2
3
 
$text = preg_replace('#(<ul.*)<br />#Usi','$1', $text);
$text = preg_replace('#(</li>.*)<br />#Usi','$1', $text);
--- edit ---

Je m'aperçois que c'est pas encore ça. Je l'ai sur le bout de la langue, mais c'est l'heure de débaucher.
Ad taleur peut-être...
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 18h00   #8
Membre chevronné
 
Homme Jérémy
Étudiant
Inscription : mars 2005
Messages : 634
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2005
Messages : 634
Points : 710
Points : 710
Merci ça marche enfin ! moi et les regexp ça fait 2, faudra que je pense à étudier un peu cette synthaxe bizarre .



Edit : bizarre chez moi ça marche
__________________
Fiquet
- FAQ SDL
- FAQ C++
Fiquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 18h03   #9
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Citation:
Envoyé par Fiquet
Edit : bizarre chez moi ça marche
Oui, mais si tu as par chance une page sans <br /> après les </li>, je pense qu'elle va t'en faire sauter au moins un autre ensuite, ce qui n'est pas bon.
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 18h18   #10
Membre chevronné
 
Homme Jérémy
Étudiant
Inscription : mars 2005
Messages : 634
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2005
Messages : 634
Points : 710
Points : 710
Citation:
Envoyé par jml94
Oui, mais si tu as par chance une page sans <br /> après les </li>, je pense qu'elle va t'en faire sauter au moins un autre ensuite, ce qui n'est pas bon.
Effectivement s'il n'y a aucun <br /> ça supprime plus loin .
__________________
Fiquet
- FAQ SDL
- FAQ C++
Fiquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 19h41   #11
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Je vais essayer plusieurs trucs.

Le premier :

Code :
1
2
 
$text = preg_replace('#(<ul.*)<br />(<li>|</ul>)#Usi','$1$2', $text);
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 19h45   #12
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Le deuxième :

Code :
1
2
3
 
 
$text = preg_replace('#(</li>.*)<br />(<li>|</ul>)#Usi','$1$2', $text);
Et peut-être un mix des deux si ça suffit pas...
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 20h06   #13
Membre chevronné
 
Homme Jérémy
Étudiant
Inscription : mars 2005
Messages : 634
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2005
Messages : 634
Points : 710
Points : 710
Les deux n'ont aucun effet, ni seules, ni ensembles . Aurais-je trouvé la regex impossible ?
__________________
Fiquet
- FAQ SDL
- FAQ C++
Fiquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 20h50   #14
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
NAN !

On va y arriver !

Et ça ?

Code :
1
2
3
 
$text = preg_replace('#(<ul.*)<br />(.*<li>|</ul>)#Usi','$1$2', $text);
$text = preg_replace('#(</li>.*)<br />(.*<li>|</ul>)#Usi','$1$2', $text);
J'ai rajouté des .* qui peuvent faire la différence.
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 22h14   #15
Membre habitué
 
Avatar de daniel61
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 120
Points : 120
Citation:
Envoyé par jml94

Code :
1
2
3
 
$text = preg_replace('#(<ul.*)<br />(.*<li>|</ul>)#Usi','$1$2', $text);
$text = preg_replace('#(</li>.*)<br />(.*<li>|</ul>)#Usi','$1$2', $text);
très bonne idée, et en fusionnant comme ça?

Code :
1
2
 
$text=preg_replace('#((?:</li>|<[ou]l[^>]*>)\s*).*(\s*(<li[\s>]|</[ou]l>))#Usi','$1$2',$text);
daniel61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 22h55   #16
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357


En fait non, une fois que les bonnes expressions seront repérées, je compte plutôt utiliser des tableaux de correspondance. Question de goût, je trouve ça plus smart, mais ce n'est qu'un avis.
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 23h28   #17
Membre chevronné
 
Homme Jérémy
Étudiant
Inscription : mars 2005
Messages : 634
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2005
Messages : 634
Points : 710
Points : 710
Et bien en fait la solution de daniel61 fonctionne, mais celle de jml94 avec les deux expressions non. Elles sont censées être équivalentes ? En tout cas la dernière solution fonctionne.
__________________
Fiquet
- FAQ SDL
- FAQ C++
Fiquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 23h57   #18
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Bah, si tu as le choix entre quelque chose qui marche et une autre qui marche pas...

Well done Daniel !

J'avais même pas lu ta belle regexp, bloqué que j'étais sur mon idée de tableaux.

C'est quand même bô une regexp comme ça, nan ?
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 00h40   #19
Membre habitué
 
Avatar de daniel61
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 120
Points : 120
Citation:
Envoyé par Fiquet
Elles sont censées être équivalentes ?
oui elles le sont, c'est bien le travail de jml94 et pas le mien.

la différence est qu'avant de poster il y avait un <br /> au centre et j'ai pensé de le remplacer par .* donc elle enlève tout sauf la mise en forme... donc aucun élément (X)HTML ne seront tolérés à ces endroits pas plus que du texte... seul <li></li> et ce qu'ils contiennent seront entre <ul></ul> et <ol></ol>... à tester tout de même.

Citation:
Envoyé par jml94
C'est quand même bô une regexp comme ça, nan ?
honnêtement, je ne l'aurais jamais vu sans ton code.
daniel61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 09h49   #20
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357


Je vais essayer de décortiquer un peu ce joli lancé de daniel61.
Code :
1
2
 
$text=preg_replace('#((?:</li>|<[ou]l[^>]*>)\s*).*(\s*(<li[\s>]|</[ou]l>))#Usi','$1$2',$text);
[ou]l : "ol" ou "ul"
[^>]* : tout caractères sauf ">"
?: : parenthèse de regroupement seul, sans capture
(?:</li>|<[ou]l[^>]*>) : on repère </li> ou <ol...> ou <ul...> sans capturer

((?:</li>|<[ou]l[^>]*>)\s*) : on repère </li> ou <ol...> ou <ul...> suivi de blancs et on capture en $1

(<li[\s>]|</[ou]l>) : on repère <li> ou <li > ou </ol> ou </ul> et on capture en $2

(\s*(<li[\s>]|</[ou]l>)) : on repère <li> ou <li > ou </ol> ou </ul> précédés de blancs et on capture en $3

entre les deux, on prend tout et on ne capture pas

Donc on va remplacer tout ce qui se trouve entre </li>, <ol...> ou <ul...> et <li> ou <li > ou </ol> ou </ul>, le tout en "ungreedy". (merci le Camel Book)

Cette expression est très belle, mais il y a encore un peu d'amélioration à apporter je pense.
Après une bonne prise de tête, je vais prendre un café avec les collègues et je reviens voir ce qu'on peut faire.

PS : pour ce genre d'expressions non-triviales, tu peux aussi demander dans le forum Perl. Ces garçons un peu extra terrestres sont souvent bilingues en regexp.
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h13.


 
 
 
 
Partenaires

Hébergement Web