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 :

Aide pour un motif avec preg_replace() [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut Aide pour un motif avec preg_replace()
    Bonjour,

    j'ai un fichier PHP me permettant de tester mon expression régulière.

    Code : 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
    <head>
    <title>test lexique</title>
    <meta http-equiv="Content-Type" content="text/HTML; charset=utf-8" />
    <meta http-equiv="Pragma" content="no-cache" />
    <style type="text/css">
    body {
    	color:#CC0000;
    	font-family:"Courier New", Courier, monospace;
    }
    span {
    	color:#33CC66;
    }
    </style>
    </head>
    <body>
     
    <?php
     
    $terme = "AB";
     
    $texte = "*** OUI ***<br />";
     
    $texte .= "oui pour &gt;'AB'&lt;"."<br />";
    $texte .= "oui pour &gt;'Ab&lt;"."<br />";
    $texte .= "oui pour &gt;'aB &lt;"."<br />";
    $texte .= "oui pour &gt;AB'&lt;"."<br />";
    $texte .= "oui pour &gt; AB'&lt;"."<br />";
     
    $texte .= "<br />";
     
    $texte .= "oui pour &gt;’Ab’&lt;"."<br />";
    $texte .= "oui pour &gt;’aB&lt;"."<br />";
    $texte .= "oui pour &gt;’ab &lt;"."<br />";
    $texte .= "oui pour &gt;AB’&lt;"."<br />";
    $texte .= "oui pour &gt; AB’&lt;"."<br />";
     
    $texte .= "<br />*** NON ***<br />";
     
    $texte .= "non pour &gt;aAB&lt;"."<br />";
    $texte .= "non pour &gt;aAB &lt;"."<br />";
    $texte .= "non pour &gt;ABb&lt;"."<br />";
    $texte .= "non pour &gt; ABb&lt;"."<br />";
     
    $texte .= "<br />";
     
    $texte .= "non pour &gt;éAB&lt;"."<br />";
    $texte .= "non pour &gt;éAB &lt;"."<br />";
    $texte .= "non pour &gt;ABé&lt;"."<br />";
    $texte .= "non pour &gt;àAB&lt;"."<br />";
    $texte .= "non pour &gt;ABà&lt;"."<br />";
    $texte .= "non pour &gt;çABç&lt;"."<br />";
     
    $motif = "`([\W\s])(".$terme.")([\W\s])`i";
    $texte = preg_replace($motif, '$1<span>$2</span>$3', $texte);
     
    echo $texte;
    ?>
    </body>
    </html>
    sauf que mon motif ne fonctionne pas à tous les cas...

    C'est à dire, qu'au lieu d'avoir :
    *** OUI ***
    oui pour >'AB'<
    oui pour >'Ab<
    oui pour >'aB <
    oui pour >AB'<
    oui pour > AB'<

    oui pour >’Ab’<
    oui pour >’aB<
    oui pour >’ab <
    oui pour >AB’<
    oui pour > AB’<

    *** NON ***
    non pour >aAB<
    non pour >aAB <
    non pour >ABb<
    non pour > ABb<

    non pour >éAB<
    non pour >éAB <
    non pour >ABé<
    non pour >àAB<
    non pour >ABà<
    non pour >çABç<
    j'ai :
    *** OUI ***
    oui pour >'AB'<
    oui pour >'Ab<
    oui pour >'aB <
    oui pour >AB'<
    oui pour > AB'<

    oui pour >’Ab’<
    oui pour >’aB<
    oui pour >’ab <
    oui pour >AB’<
    oui pour > AB’<

    *** NON ***
    non pour >aAB<
    non pour >aAB <
    non pour >ABb<
    non pour > ABb<

    non pour >éAB<
    non pour >éAB <
    non pour >ABé<
    non pour >àAB<
    non pour >ABà<
    non pour >çABç<
    Merci d'avance... car là j'avoue je ne vois pas pourquoi...

  2. #2
    Membre émérite
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Points : 2 969
    Points
    2 969
    Par défaut
    Salut, tu peux nous dire ce que tu souhaites faire ? Le résultat que tu attends, ce que tu obtiens à la place... Ca sera plus simple pour nous t'aider
    Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN

    F.A.Q. : Java, PHP, (X)HTML / CSS

    N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème

  3. #3
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Désolé je pensais avoir été clair avec mes exemples...

    j'aimerais que mon expression régulière ajoute le balise <SPAN> dans certains cas (les lignes avec oui) et pas dans d'autres (les lignes avec non).

    En gros, je souhaite détecter une chaine parmi d'un texte à certaines conditions comme :
    - le terme "ea" ne doit être détecté dans "eau" ni dans "l'eau" ni dans "marteau"...
    - le terme "ea" doit être déctecté dans " ea ", ".e.a.", "(ea)", ",ea", "ea:", etc...


  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 743
    Points
    11 743
    Par défaut
    C'est un problème de locale. Quand aucune locale n'est fixé, les lettres accentuées sont considérées comme des caractères spéciaux (donc, des \W) et non des lettres.

    Il suffit que tu mettes une locale pour les lettres accentuées deviennent des lettres (des \w). Ça se fait avec setlocale.

    Tu peux également utiliser \b pour désigner une limite de mot, ce sera une alternative plus simple et plus exacte à [\W\s].
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    je comprends pas bien ce qu'est une "locale" ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $motif = "`(\b)(".$terme.")(\b)`i";
    $texte = preg_replace($motif, '$1<span>$2</span>$3', $texte);
    donne exactement le même résultat.

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 743
    Points
    11 743
    Par défaut
    Citation Envoyé par Tchupacabra Voir le message
    je comprends pas bien ce qu'est une "locale"
    Une locale définit un ensemble de paramètres dits "de localisation", tels que le séparateur décimal, la devise par défaut, la langue à utiliser pour les noms des mois ou des jours de la semaine, etc. Pour ce qui concerne les regex, ça influe essentiellement sur la reconnaissance des caractères, par exemple en déterminant ce qui est \w ou \W.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    la détection REGEX avec cette même page encodée en ISO-8859-1 fonctionne parfaitement !

    est-ce que je suis obligé d'encoder mon texte avant preg_replace() ?

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 743
    Points
    11 743
    Par défaut
    Parce que si tu n'encodes pas tu es en quoi ? en UTF-8 ?

    RTFM pour savoir si les preg comprennent correctement l'Unicode.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    ma page est entièrement en UTF-8...
    la doc PHP n'est pas très clair sur l'UTF-8, je trouve rien d'interessant.


  10. #10
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    j'ai trouvé quelque chose d'intéressant sur ce site http://www.expreg.com/options.php
    Il y a l'option u qui permettrai de traiter les chaines UTF-8...
    u (PCRE_UTF8)
    Cette option désactive les fonctionnalités additionnelles de PCRE qui ne sont pas compatibles avec Perl. Les chaînes sont traitées comme des chaînes UTF-8. Cette option est disponible en PHP 4.1.0 et plus récent.
    Effectivement j'ai testé et cela fonctionne avec mes tests.
    Avec le peu d'info à ce sujet, j'ai peur pour la fiabilité de cette option...

    Qu'en pensez-vous ? Vous avez des commentaires sur cette option ?

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

Discussions similaires

  1. besoin d'aide pour une jointure avec une exclusion
    Par manu_71 dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/02/2007, 11h22
  2. Réponses: 24
    Dernier message: 12/02/2007, 23h56
  3. Réponses: 16
    Dernier message: 01/02/2007, 16h04
  4. Aide pour un warning avec RegSetValueEx
    Par Pierre.g dans le forum Windows
    Réponses: 4
    Dernier message: 24/08/2006, 14h46
  5. [PHP-JS] besoin d'aide pour menu déroulant avec lien
    Par Damarus dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 18h43

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