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 :

Trouver des motifs qui ne contiennent pas un certain motif [Fait] [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 66
    Points : 43
    Points
    43
    Par défaut Trouver des motifs qui ne contiennent pas un certain motif
    Bonjour à tous,
    Voici la question que je me pose : comment matcher une balise html ne contenant pas un attribut ?
    Exemple :
    Je ne veux pas matcher :
    <textarea required="true" />
    Mais matcher :
    <textarea />
    ou
    <textarea cols="50" />
    etc.

    Pour tout matcher, je fais : <textarea[^>]*/>
    Mais comment faire pour spécifier que je ne veux pas que le pattern matché contienne le pattern required

    Merci d'avance

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Je n'ai pas trouvé comment faire avec les assertions négatives.

    Voilà ce que j'ai essayé dans un premier temps (toujours avec le même exemple que dans mon premier message) :
    <textarea[^>]*(?<!required="true") />

    Nickel! Ca marche avec mon exemple. Mais ça marche car required="true" se trouve à la fin du tag. Prenons les lignes suivantes pour compliquer un peu :
    <textarea rows="20" required="true" cols="50" />
    (où je veux matcher des textarea

    Dans ce cas mon pattern ne convient plus (puisqu'il y a des caractères après le required="true").
    Donc j'adapte :
    <textarea[^>]*(?<!required="true")[^>]*/>

    Mais là évidemment ça ne marche pas : ça matche <textarea rows="20" required="true" cols="50" /> alors que je ne veux pas.
    Ca me paraît logique car il semble difficile d'utiliser des assertions négatives sans les faire précéder ou suivre d'une chaîne de caractère "fixe".
    En l'occurence, si je prend la ligne <textarea rows="20" required="true" cols="50" />, alors le premier pattern [^>]* peut être identifié comme rows et avec le deuxième pattern [^>]* identifier ="20" required="true" cols="50" . Et ainsi on a bien le deuxième [^>]* qui n'est pas précédé par required="true".
    Du coup, ça matche la chaîne alors que je veux pas

    Quelqu'un a une idée ??

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    J'ai fait l'essai rapidement avec :
    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
    <?php
    $array = array(
        '<textarea>',
        '<textarea />',
        '<textarea cols="60" />',
        '<textarea cols="60" rows="60">',
        '<textarea required="true">',
        '<textarea cols="60" required="true" rows="60">',
        '<textarea cols="60" required="true">',
        '<textarea required="true" rows="60">',
        '<textarea required="false">',
        '<textarea cols="60" required="false" rows="60">',
        '<textarea cols="60" required="false">',
        '<textarea required="false" rows="60">',
        '<textarea is_required="true">',
        '<textarea cols="60" is_required="true" rows="60">',
        '<textarea cols="60" is_required="true">',
        '<textarea is_required="true" rows="60">'
    );
     
    header('Content-type: text/plain');
    foreach ($array as $v) {
        printf("$v : %s".PHP_EOL, preg_match('/<textarea(?:(?!\brequired="true")[^>])*>/Uis', $v) ? 'OK' : 'KO');
    }
     
    echo str_repeat('-', 60) . PHP_EOL;
     
    if (preg_match_all('/<textarea(?:(?!\brequired="true")[^>])*>/Uis', implode(PHP_EOL, $array), $matches, PREG_SET_ORDER)) {
        foreach ($matches as $m) {
            echo $m[0] . PHP_EOL;
        }
    }
    Sinon ce doit être aussi faisable avec DOM/DOMXML

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Un énorme merci !
    Ca marche impec !!

    Il ne me reste plus qu'à me pencher sur ce pattern pour le comprendre en détail.

    Bonne journée et merci encore !

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

Discussions similaires

  1. Des panel qui ne changent pas de couleur
    Par richard038 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/03/2006, 10h37
  2. Interdire des navigateur qui ne sont pas a jour ?
    Par allpicI2c dans le forum Général Conception Web
    Réponses: 5
    Dernier message: 28/01/2006, 19h30
  3. UNION ? des lignes qui ne sont pas prises...
    Par fred23195 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/12/2005, 15h50
  4. [XSL][re] Ecrire des balise qui ne seront pas interpretées
    Par FrRoulio dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/03/2004, 13h32
  5. la liste des clients qui n'ont pas acheter aucun article ...
    Par TéBeSsI dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/02/2004, 15h57

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