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 29/01/2008, 21h56   #1
Invité de passage
 
Inscription : octobre 2004
Messages : 2
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 2
Points : 1
Points : 1
Par défaut Utilisation de preg_replace()

Salut,

J'ai une question débile pour un problème qui me semble simple mais auquel je n'arrive pas à trouver de solution.

Dans l'exemple suivant, 1 et 2 fonctionnent, mais 3 non. j'aimerais bien comprendre pourquoi?

Code :
1
2
3
4
5
6
7
8
9
// Quelque soit la valeur de x
//(1) Suppression de <p>x</p>
$content=preg_replace('/\<p\>(.*?)\<\/p\>/s','',$content);
 
//(2) Suppression de <p>NP-x</p>
 $content=preg_replace('/\<p\>NP-(.*?)\<\/p\>/s','',$content);
 
//(3) Suppression de <p>x-NP</p>
$content=preg_replace('/\<p\>(.*?)-NP\<\/p\>/s','',$content);

Un petit peu d'aide s'il vous plait

-[STK]-
ShuTruK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 23h02   #2
Membre habitué
 
Inscription : octobre 2005
Messages : 641
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 641
Points : 143
Points : 143
Code :
$content=preg_replace('/<p>.*-NP<\p>/s','',$content);
ne serait pas plus mieux et plus simple ?

1er post depuis 2004 ?
Tchupacabra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 23h16   #3
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Citation:
Envoyé par Tchupacabra Voir le message
Code :
$content=preg_replace('/<p>.*-NP<\p>/s','',$content);
ne serait pas plus mieux et plus simple ?
Non, .* (étoile gourmande) va provoquer des anomalies que .*? (étoile paresseuse) évitera, et ce qu'il faut chercher c'est </p> et non <\p>.

Citation:
Envoyé par ShuTruK Voir le message
Dans l'exemple suivant, 1 et 2 fonctionnent, mais 3 non. j'aimerais bien comprendre pourquoi?
Peux-tu donner les exemples avec lesquelles tu testes ? Tchupacabra a raison sur < et >, qui n'ont pas à être échappés... Ça n'est pas censé provoquer des erreurs, mais je recommanderais quand même :

Code :
$content=preg_replace('!<p>(.*?)-NP</p>!s','',$content);
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 23h20   #4
Membre habitué
 
Inscription : octobre 2005
Messages : 641
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 641
Points : 143
Points : 143
je ne connaissais pas cette "étoile gourmande" (en ressource CPU ?)
la seconde erreur est une faute d'inattention de ma part... désolé.
Tchupacabra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 23h42   #5
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
L'étoile gourmande, c'est l'étoile normale *... Prenons un exemple :

texte :
Code :
bidule<p>truc</p><p>machin</p>chouette
regex : la regex reconnaîtra la partie en gras :
Code :
bidule<p>truc</p><p>machin</p>chouette
Explication : l'étoile est gourmande, c'est-à-dire qu'elle avale tout ce qu'elle peut. Donc la regex part du premier <p>, puis avale tout le reste du texte jusqu'à la fin. Du coup, elle ne trouve pas la balise fermante </p>, ce qui serait un échec de la reconnaissance. Pour éviter l'échec, la regex recrache alors caractère par caractère. Quand elle a recraché le dernier </p>, la regex réussit : elle a bien un début en <p>, n'importe quoi au milieu, et </p> à la fin.

Une première solution consiste à éviter ., et à mettre qqch de plus restrictif. Par exemple, cette regex s'arrêtera à la prochaine balise :
L'autre solution, souvent plus simple, consiste à remplacer l'étoile gourmande par l'étoile paresseuse *?. Cette étoile n'avale pas tout ce qu'elle peut, mais au contraire s'arrête dès qu'elle peut le faire sans faire échouer la reconnaissance. Donc cette regex s'arrêtera au prochain </p> :
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 00h49   #6
Invité de passage
 
Inscription : octobre 2004
Messages : 2
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 2
Points : 1
Points : 1
J'échappais les caractères parce que j'ai appris comme ca, mais effectivement c'est pareil.

Concernant le code ca ne fonctionne toujours pas.
En gros, mon script transforme des pages .html comportant des tableaux en fichiers .sql.
Le truc c'est que les lignes avec NP je n'en veux pas.

Enfin voila juste un test :

Code :
1
2
3
4
5
6
7
<?php
  $content='<tr><td><strong>5-13</strong></td><td>&nbsp;</td><td>16.80</td></tr><tr><td><strong>5-NP</strong></td><td>&nbsp;</td><td>&nbsp;</td></tr>';
 
  $content=preg_replace('!<tr><td><strong>(.*?)-NP</strong></td><td>(.*?)</td><td>(.*?)</td></tr>!s','',$content);
 
  echo $content;
?>
On a donc 2 lignes de tableau, 1 avec un NP et 1 sans. Et chez moi, le preg_replace() supprime tout!

Alors que si je déplace le -NP avant le 5 comme ca: "NP-5" , voire comme ca "-NP5"
Code :
1
2
3
4
5
6
7
<?php
  $content='<tr><td><strong>5-13</strong></td><td>&nbsp;</td><td>16.80</td></tr><tr><td><strong>NP-5</strong></td><td>&nbsp;</td><td>&nbsp;</td></tr>';
 
  $content=preg_replace('!<tr><td><strong>NP-(.*?)</strong></td><td>(.*?)</td><td>(.*?)</td></tr>!s','',$content);
 
  echo $content;
?>
Ca marche sans problème, c'est de la folie cette histoire!

-[STK]-

Edit : Finalement, j'ai trouvé. A la place de: (.*?), je mets: [0-9\-]{1,}-NP
Merci pour votre aide
ShuTruK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 19h18   #7
Membre habitué
 
Inscription : octobre 2005
Messages : 641
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 641
Points : 143
Points : 143
merci Antoun pour l'explication de l'étoile gourmande...
Tchupacabra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 21h04   #8
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Citation:
Envoyé par ShuTruK Voir le message
Edit : Finalement, j'ai trouvé. A la place de: (.*?), je mets: [0-9\-]{1,}-NP
Merci pour votre aide
Dont tu peux simplifier l'écriture en
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun 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 13h06.


 
 
 
 
Partenaires

Hébergement Web