PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.javascript > regexp, match
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
regexp, match

Réponse
 
LinkBack Outils de la discussion
Vieux 23/09/2007, 19h04   #1
Mihamina (R12y) Rakotomandimby
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut regexp, match

Bonjour,
Soient les morceaux de code suivants:
http://svn.infogerance.us/code/brows...unk/index.html
http://svn.infogerance.us/code/brows...check_input.js

Ce que je cherche à faire avec est de faire un fomulaire avec un champ
texte et un submit mais ou le bouton submit disparait:
- quand un un caractère non autorisé est entré
- quand la chaine entrée contient un caractère non autorisé.

Je fais le controle de la chaine entrée à chaque evenement onKeyUp.
Je n'autausrise que les lettres majuscules et minuscules.

Le problème est que ce code fonctionne partiellement:
- le bouton submit disparait quand je rentre un espace mais réapparait
quand je rentre une lettre...
- ce n'est pas regulier, mais aléatoire.

Le navigateur avec lequel je teste: Firefox 2
Une chaine, entrée par caractère qui déclenche le bug: "ddd d d d d d d"

Merci pour tout eventuel coup de main.
  Réponse avec citation
Vieux 23/09/2007, 19h36   #2
Mihamina (R12y) Rakotomandimby
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: regexp, match

Mihamina (R12y) Rakotomandimby wrote:

> http://svn.infogerance.us/code/brows...check_input.js


> Le navigateur avec lequel je teste: Firefox 2
> Une chaine, entrée par caractère qui déclenche le bug: "ddd d d d d d d"


Si je fait
var expression = /[^a-z]/i;
au lieu de
var expression = /[^a-z]/gi;

Alors ça fonctionne.
Maintenant, je cherche à comprendre...
  Réponse avec citation
Vieux 23/09/2007, 22h28   #3
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: regexp, match

Le 23/09/2007 20:36, Mihamina (R12y) Rakotomandimby a écrit :
>
>> http://svn.infogerance.us/code/brows...check_input.js

>
>> Le navigateur avec lequel je teste: Firefox 2
>> Une chaine, entrée par caractère qui déclenche le bug: "ddd d d d d d d"

>
> Si je fait
> var expression = /[^a-z]/i;
> au lieu de
> var expression = /[^a-z]/gi;
>
> Alors ça fonctionne.
> Maintenant, je cherche à comprendre...


Je n'ai pas la référence JavaScript près de moi, mais il me semble en
tout cas que si tu utilises exec() au lieu de test() le type du résultat
(tableau ou autre, peut-être une chaîne de caractères) dépend du nombre
de résultats trouvés. Alors transformer ce résultat en booléen comme tu
le fais me semble assez aléatoire avant de savoir ce qui doit réellement
être rendu.

Alors essaye de remplacer « if (resultat) » par « if (resultat.length) »
si tu es joueur, ou bien utilise test() à la place de exec(). Mais le
mieux serait quand même de lire une doc de référence.
  Réponse avec citation
Vieux 24/09/2007, 02h31   #4
Mickaël Wolff
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: regexp, match

Mihamina (R12y) Rakotomandimby a écrit :
> Si je fait
> var expression = /[^a-z]/i;
> au lieu de
> var expression = /[^a-z]/gi;
>
> Alors ça fonctionne.
> Maintenant, je cherche à comprendre...


C'est parce que ta regexp ne contient pas les notions de début et de
fin d'expression, et qu'avec le taf global, il trouvait une portion de
la chaine testée qui correspondait à la regexp.

Pour être certain de tester toute la chaine, il faut indiquer que la
regexp contiennent les séquences de début (^) et de fin ($) de chaine :

/^[^a-z]$/i

/^[^a-z]$/i.exec('ddd') == null
/^[^a-z]$/i.exec('ddd ') == null
/^[^a-z]$/i.exec('ddd d') == null
/^[^a-z]$/i.exec(' ').length == 1

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
  Réponse avec citation
Vieux 24/09/2007, 02h35   #5
Mickaël Wolff
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: regexp, match

Olivier Miakinen a écrit :

> Alors transformer ce résultat en booléen comme tu
> le fais me semble assez aléatoire avant de savoir ce qui doit réellement
> être rendu.


Ça renvoie un tableau ou null. Un tableau c'est toujours vrai, et
null, false. Donc il n'y a pas d'ambiguïté.

Mais c'est vrai que test, ce serait mieux. Ça optimiserais un chouia

> Alors essaye de remplacer « if (resultat) » par « if (resultat.length) »


Euh, non, puisqu'en cas de regex non vérifiée, Regexp.exec renvoie
null, et donc on risque de lever une exeception. Cf ma réponse qui a
télescopée la tienne.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
  Réponse avec citation
Vieux 24/09/2007, 10h39   #6
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: regexp, match

Le 24/09/2007 03:35, Mickaël Wolff a écrit :
>
>> Alors transformer ce résultat en booléen comme tu
>> le fais me semble assez aléatoire avant de savoir ce qui doit réellement
>> être rendu.

>
> Ça renvoie un tableau ou null. Un tableau c'est toujours vrai, et
> null, false. Donc il n'y a pas d'ambiguïté.


S'il n'y a pas d'ambiguïté, alors comment expliquer le résultat obtenu
par Mihamina ?

> Mais c'est vrai que test, ce serait mieux. Ça optimiserais un chouia
>
>> Alors essaye de remplacer « if (resultat) » par « if (resultat.length) »

>
> Euh, non, puisqu'en cas de regex non vérifiée, Regexp.exec renvoie
> null, et donc on risque de lever une exeception.


D'accord avec ça. J'aurais mieux fait d'attendre de relire la doc avant
de sortir des bêtises.
  Réponse avec citation
Vieux 24/09/2007, 10h46   #7
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: regexp, match

Le 24/09/2007 03:31, Mickaël Wolff a écrit :

>> Si je fait
>> var expression = /[^a-z]/i;
>> au lieu de
>> var expression = /[^a-z]/gi;
>>
>> Alors ça fonctionne.
>> Maintenant, je cherche à comprendre...

>
> C'est parce que ta regexp ne contient pas les notions de début et de
> fin d'expression, et qu'avec le taf global, il trouvait une portion de
> la chaine testée qui correspondait à la regexp.


Ah non, je ne suis pas d'accord du tout.

Soit la chaîne "ddd d d d d d d".
/[^a-z]/i devrait donner array(" ")
/[^a-z]/gi devrait donner array(" ", " ", " ", " ", " ", " ")
Dans un cas comme dans l'autre, le tableau est non vide.

Je me trompe ?

> Pour être certain de tester toute la chaine, il faut indiquer que la
> regexp contiennent les séquences de début (^) et de fin ($) de chaine :
>
> /^[^a-z]$/i


Ben non, ça ne peut pas fonctionner. Avec ce test, tu ne peux détecter
que les chaînes dont le *seul* caractère est autre chose qu'une lettre.

> /^[^a-z]$/i.exec('ddd') == null


C'est bien, c'est ce qu'on veut.

> /^[^a-z]$/i.exec('ddd ') == null
> /^[^a-z]$/i.exec('ddd d') == null


Là c'est incorrect : on voudrait cacher le bouton Submit dans de tels cas.

> /^[^a-z]$/i.exec(' ').length == 1


Ben oui, là il n'y a qu'un seul caractère.
  Réponse avec citation
Vieux 24/09/2007, 12h16   #8
Mickaël Wolff
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: regexp, match

Olivier Miakinen a écrit :

>> C'est parce que ta regexp ne contient pas les notions de début et de
>> fin d'expression, et qu'avec le taf global, il trouvait une portion de
>> la chaine testée qui correspondait à la regexp.

>
> Ah non, je ne suis pas d'accord du tout.
>
> Soit la chaîne "ddd d d d d d d".
> /[^a-z]/i devrait donner array(" ")
> /[^a-z]/gi devrait donner array(" ", " ", " ", " ", " ", " ")
> Dans un cas comme dans l'autre, le tableau est non vide.


> Je me trompe ?


Non, nous sommes d'accord.


>> Pour être certain de tester toute la chaine, il faut indiquer que la
>> regexp contiennent les séquences de début (^) et de fin ($) de chaine :
>>
>> /^[^a-z]$/i

>
> Ben non, ça ne peut pas fonctionner. Avec ce test, tu ne peux détecter
> que les chaînes dont le *seul* caractère est autre chose qu'une lettre.


Pardon, je suis allé trop vite. Il fallait lire /^[^a-z]+$/i bien
évidemment. Merci d'avoir relevé Mais en fait non, dans le cas
présent, ça ne va toujours pas. Parce que ça ne détecte que les chaines
composées de caractères interdits.

/^([^a-z]+|[a-z]*)+$/i devrait alors être utilisé si on veut être
certain de trouver au moins un caractère rejeté... mais c'est un peu
usine à gaz.

En fait, même sans utiliser le flag global ça aurait dû marcher...
Mihamina, est-ce que sans le flag global ta regexp continue à déconner
maintenant ?

Désolé d'avoir raconté des conneries, je lis trop vite les messages
auxquels je répond. Je vais aller cueillir des orties fraiches.


--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 06h26.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,14177 seconds with 16 queries