Page 1 sur 1

Les expressions régulières en Javascript

Posté : 14 déc. 2006, 17:04
par Whitecoyote
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. :?

Posté : 14 déc. 2006, 17:37
par Ryle
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

Posté : 14 déc. 2006, 17:47
par Whitecoyote
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 ?

Posté : 14 déc. 2006, 18:32
par Cyrano
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

Posté : 14 déc. 2006, 19:52
par Whitecoyote
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 ? :?:

Posté : 14 déc. 2006, 22:07
par Cyrano
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.

Posté : 15 déc. 2006, 11:47
par Whitecoyote
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

Posté : 15 déc. 2006, 14:47
par Cyrano
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 ;)

Posté : 15 déc. 2006, 14:57
par naholyr
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).

Posté : 15 déc. 2006, 15:02
par Cyrano
...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-|