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 16/07/2007, 18h22   #1
Membre à l'essai
 
Inscription : mars 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 66
Points : 23
Points : 23
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
pellec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2007, 19h02   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Avec une assertion négative avant ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2007, 18h19   #3
Membre à l'essai
 
Inscription : mars 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 66
Points : 23
Points : 23
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 ??
pellec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2007, 19h25   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
J'ai fait l'essai rapidement avec :
Code :
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
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2007, 09h15   #5
Membre à l'essai
 
Inscription : mars 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 66
Points : 23
Points : 23
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 !
pellec 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 17h20.


 
 
 
 
Partenaires

Hébergement Web