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 :

recherche du bon masque pour preg_match [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut recherche du bon masque pour preg_match
    Bonjour,
    Je me remets doucement à la programmation et je suis en train de mettre au point un moteur de recherche sur mon site de chansons.
    Pour ce faire j'essaye de trouver le bon masque pour preg_match.
    Je passe à la variable $_GET['ancre'] la valeur |Ancré| (sans les pipes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    ini_set('display_errors', 'E_ALL');
    header( 'content-type: text/html; charset=utf-8' );
    $pourvoir=$_GET['ancre'];
    $motif='~\b(?:'.$pourvoir.')~';
    $textes=array('Ancré','ancré',' Ancré',' ancré','Ancrés','ancrés',' Ancrés',' ancrés');
    foreach($textes as $texte){
            if(preg_match($motif,' '.$texte)){
                    echo 'Jes ', $motif,' |',$texte,'|<br />';
                    }
             else{
                    echo '<em>Ne ', $motif,' |',$texte,'|</em><br />';
                    }
            }
    Et voilà ce que je reçois en retour ce qui n'est pas le résultat attendu:
    Jes ~\b(?:Ancré)~ |Ancré|
    Ne ~\b(?:Ancré)~ |ancré|
    Jes ~\b(?:Ancré)~ | Ancré|
    Ne ~\b(?:Ancré)~ | ancré|
    Jes ~\b(?:Ancré)~ |Ancrés|
    Ne ~\b(?:Ancré)~ |ancrés|
    Jes ~\b(?:Ancré)~ | Ancrés|
    Ne ~\b(?:Ancré)~ | ancrés|
    puisque cela ne devrait matcher que pour le premier et le troisième item de l'array $textes.
    Il y a donc quelque chose qui cloche dans le motif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $motif='~\b(?:'.$pourvoir.')~';
    mais quoi ?
    Je sèche, lamentablement.
    Merci de me lire et, a fortiori, de m'aider.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 998
    Par défaut
    Pour obtenir le résultat voulu, tu dois écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $motif = '~\bAncré\b~u';
    Le groupe non-capturant n'est pas utile, je l'ai enlevé.
    Pour n'obtenir que les mots ne se finissant pas par un s, tu dois également délimiter ton motif avec un word-boundary \b à droite. Mais, petite subtilité, le word-boundary est la limite entre un caractère de la classe \w et autre chose (un caractère n'appartenant pas à cette classe ou la limite de la chaîne). Or, par défaut la classe \w est équivalente à [a-zA-Z0-9_], donc les lettres accentuées n'y figurent pas.
    Mais si j'ajoute le modificateur u, la classe \w est étendue à toutes les lettres et les chiffres de la table unicode (plus le underscore), ce qui inclus les lettres accentuées. Ce qui impacte donc le comportement du word-boundary.

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    mister-regex est impressionnant

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Merci beaucoup CosmoKnacki

    J'ai suivi tes recommandations (à la lettre si j'ose dire) mais le résultat n'est toujours pas celui attendu.
    J'ai même corsé en ajoutant un item à $texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $textes=array('Ancré','ancré',' Ancré',' ancré','Ancrés','ancrés',' Ancrés',' ancrés','Ancré,');
    car je souhaite aussi que si le mot est suivi d'une virgule il soit retenu par preg_match
    Or voici ce que j'obtiens
    Ne ~\bAncré\b~u |Ancré|
    Ne ~\bAncré\b~u |ancré|
    Ne ~\bAncré\b~u | Ancré|
    Ne ~\bAncré\b~u | ancré|
    Jes ~\bAncré\b~u |Ancrés|
    Ne ~\bAncré\b~u |ancrés|
    Jes ~\bAncré\b~u | Ancrés|
    Ne ~\bAncré\b~u | ancrés|
    Ne ~\bAncré\b~u |Ancré,|
    presque le contraire de ce que je voudrais.
    Je souhaite que soit retenus |Ancré|, | Ancré| et |Ancré,| et non |Ancrés| et | Ancrés|.
    Avec un autre exemple de mot je voudrais que |malheur| soit retenu mais pas |malheurs| ni |malheureux|
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 998
    Par défaut
    Et pourtant ça fonctionne: https://3v4l.org/8LDv3#v8.2.9

    Quelle est ta version de PHP ?

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    C'est sur le serveur fédératif de mon hébergeur, je crois qu'il est en PHP5. (5.2.17 d'après phpinfo)

    Le script se lance comme ça :
    http://www.avcxjo-moko-kantas.fr/job...cre=Ancr%C3%A9
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    J'ai essayé le script avec l'outil https://3v4l.org (nickel cet outil que je connaissais pas) en me mettant en 5.2.17 et ça donne
    <em>Ne ~\bAncré\b~u |Ancré|</em><br />
    <em>Ne ~\bAncré\b~u |ancré|</em><br />
    <em>Ne ~\bAncré\b~u | Ancré|</em><br />
    <em>Ne ~\bAncré\b~u | ancré|</em><br />
    Jes ~\bAncré\b~u |Ancrés|<br />
    <em>Ne ~\bAncré\b~u |ancrés|</em><br />
    Jes ~\bAncré\b~u | Ancrés|<br />
    <em>Ne ~\bAncré\b~u | ancrés|</em><br />
    <em>Ne ~\bAncré\b~u |Ancré,|</em><br />

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

Discussions similaires

  1. [MySQL] recherche du bon critere pour ma requete
    Par lamouche42 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/05/2010, 04h30
  2. [RegEx] Recherche du bon pattern pour une expression régulière
    Par erehcab dans le forum Langage
    Réponses: 9
    Dernier message: 17/03/2010, 14h06
  3. Réponses: 7
    Dernier message: 18/05/2009, 18h05
  4. Recherche du bon évènement pour un SELECT
    Par PedroBD dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/12/2006, 14h17
  5. Réponses: 3
    Dernier message: 09/10/2005, 20h10

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