Les expressions régulières en Javascript

Petit nouveau ! | 7 Messages

14 déc. 2006, 17:04

Bonjour, je débute en javascript, et en vue de faire un bbCode, j'ai besoin de reconnaître un certaine chaîne de caractères. Apparement, le rpoblème est que je ne parviens pas à échapper les crochets, ou quelque chose comme ça, car ce code tout bête plante, et je n'arrive pas à savoir pourquoi.

Code : Tout sélectionner

var balise= "[]"; var reg_balises= new RegExp("\[\]"); alert(reg_balises.test(balise));
Il renvoie false au lieu de true et si j'enlève le deuxième crochet (ainsi que l'antislash), il plante, purement et simplement. :?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

14 déc. 2006, 17:37

J'ai essayé et j'ai effectivement le même soucis, je ne comprend pas trop pourquoi... au pire tu peux modifier ton expression ainsi :

Code : Tout sélectionner

new RegExp("[[][]]");
ce qui semble fonctionner, même si c'est pas très lisible ça revient au même...

Si jamais quelqu'un sait pourquoi le "\[" ne passe pas, ça serait interessant :-k
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 7 Messages

14 déc. 2006, 17:47

Ah ! Je n'y avais pas pensé ! Merci, je vais faire ça, et si quelqu'un peut expliquer ce bug... :)

EditEn fait ça a pas l'air de marcher mieux, je crois que le code est ambigu. Tu l'as testé sous quel navigateur ?

Mammouth du PHP | 19672 Messages

14 déc. 2006, 18:32

Attention, en JavaScript, les masques doivent comporter un délimiteur qui est le "/". Donc pour chercher une paire de crochets, on peut créer une petite fonction qui recevra en paramètre la chaine à tester et procéder comme suit:
/**
 * Retourne un booléen, true si les crochets sont trouvés, false sinon.
 */
function chercheCrochets(chaine)
{
    return(chaine.search(/\[\]/) != -1)
}
Mais attention, là, on ne cherche qu'une paire de crochets vides. Donc pour chercher une balise en particulier, il faudra ajouter les éléments nécessaires :
/**
 * Retourne un booléen, true si les crochets sont trouvés, false sinon.
 */
function chercheBalise(chaine)
{
    return(chaine.search(/\[[a-z]\]/i) != -1)
}
À tester. Voir une page indispensable pour la mise au point des RegExp en JavaScript
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 7 Messages

14 déc. 2006, 19:52

Effectivement, ça marche, mais avec ça, je suis bien embêté si je veux récupérer ce qu'il y a entre les crochets. Il n'y a pas une méthode uniquement avec les Regex ? :?:

Mammouth du PHP | 19672 Messages

14 déc. 2006, 22:07

reformule ta question, j'ai une vague idée de ce que tu cherches, mais j'aimerais autant en être sûr.

Au cas où je serais dans la bonne direction, je te donne quand même un indice : "parenthèses capturantes". Le lien que je t'ai filé est juste le testeur, il y a des articles à coté sur des pages parallèles du même site, explore ça à fond, même en JavaScript on peut faire pas mal de choses avec des expressions régulières.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 7 Messages

15 déc. 2006, 11:47

Je crois que tu as compris ce que je cherchais.
J'ai un bbCdoe, et j'essaie de créer un fonction me permettant d'insérer un certain texte à partir de l'attribut title de mon image, via le gestionnaire d'évènements onclick.
Ma fonction, elle, doit faire plusieurs choses en fonction de l'attribut, et c'est pour cela que j'ai besoin des regex (et des parenthèses capturantes). Il me faut savoir dans un premier temps si le texte est entre crochets, puis, s'il l'est, en extraire le texte qu'ils contiennent. Mais voilà, comme je l'ai dit précédemment, que les crochets soient vides ou pas, mon code bugue, et je ne trouve pas l'erreur.

Code : Tout sélectionner

var balise= path.title; var reg_balises= new RegExp("\[(.+)\]"); alert(reg_balises.test(balise));
Enfin ce que je constate, c'est que ce sont les crochets qui font tout planter, car même en simplifiant le code comme exposé quelques posts plus haut, le code plante.
J'aimerais comprendre pourquoi ce code plante, et trouver une solution (si possible avec les Regex, car elles me seront indispensables pour la suite).

Merci :D

Mammouth du PHP | 19672 Messages

15 déc. 2006, 14:47

Ta reformulation n'a rien de beaucoup plus explicite et tu me remets exactement le même code que tu avais montré dans le premier post. On est donc pas tellement plus avancé.

Mais ce que j'essaye de te faire voir, c'est qu'une formulation complète et claire du problème va te permettre de résoudre tout seul 80% de la question.

Comment formuler une question, exemple :
-1- Situation de départ : tu as une chaine "blablabla"
-2- À l'aide d'une expression Régulière dans une fonction en JavaScript, tu veux récupérer la partie "...?..." pour la transformer en "gnagnagna".
-3- J'ai mis au point le masque "code"
-4- Le code plante et j'ai comme message d'erreur "bla bla ligne xx"

À toi de jouer ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

15 déc. 2006, 14:57

Tu as oublié qu'il y a des délimiteurs dans les expressions régulières. Le format est délimiteur ouvrant+expression+délimiteur fermant+options.

new Regexp("\[\]") est tout simplement invalide, la bonne solution est new Regexp("/\[\]/") ou /\[\]/.

Edit : ouais bon désolé, j'avais pas lu tout le sujet, mais je pense que dans le code proposé un peu plus haut par Cyrano il manque l'échappement des crochets. Pour moi un match-test sur /[]/ renverra toujours true ([] = aucun caractère).

Mammouth du PHP | 19672 Messages

15 déc. 2006, 15:02

...je pense que dans le code proposé un peu plus haut par Cyrano il manque l'échappement des crochets. Pour moi un match-test sur /[]/ renverra toujours true ([] = aucun caractère).
Moi je pense pas, j'en suis convaincu, c'est un oubli de ma part, bien vu 8-|
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: