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 :

Utilisation de preg_replace() [RegEx]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 2
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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]-

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $content=preg_replace('/<p>.*-NP<\p>/s','',$content);
    ne serait pas plus mieux et plus simple ?

    1er post depuis 2004 ?

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Citation Envoyé par Tchupacabra Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $content=preg_replace('!<p>(.*?)-NP</p>!s','',$content);

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    je ne connaissais pas cette "étoile gourmande" (en ressource CPU ?)
    la seconde erreur est une faute d'inattention de ma part... désolé.

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    L'étoile gourmande, c'est l'étoile normale *... Prenons un exemple :

    texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bidule<p>truc</p><p>machin</p>chouette
    regex : la regex reconnaîtra la partie en gras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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> :

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 2
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    merci Antoun pour l'explication de l'étoile gourmande...

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    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

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

Discussions similaires

  1. [RegEx] Utilisation de preg_replace ()
    Par erehcab dans le forum Langage
    Réponses: 14
    Dernier message: 16/07/2009, 21h07
  2. [RegEx] Encodage et utilisation de preg_replace()
    Par Tchupacabra dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2008, 16h52
  3. [RegEx] Utilisation de preg_replace
    Par fadex dans le forum Langage
    Réponses: 3
    Dernier message: 06/01/2007, 10h50
  4. [RegEx] utilisation de preg_replace
    Par magdalena dans le forum Langage
    Réponses: 1
    Dernier message: 30/08/2006, 14h43
  5. [RegEx] utilisation de preg_replace sur des balises
    Par Kerod dans le forum Langage
    Réponses: 5
    Dernier message: 09/12/2005, 13h46

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