je veux savoir si userAgent comporte la chaine de caractère suivante :
AppleWebKit/527+
en particulier avec le "+" final et quelque soit le nombre, ici 527, et
qui pourrait être 525.18 (une version de build).
si j'écris le js suivant :
var isWebkitNightly=navigator.userAgent.match(RegExp(" AppleWebKit/[^
]+\+ "));
firefox me dit :
Erreur : invalid quantifier +
Fichier Source : http://127.0.0.1/Canvas/l_system_hair_ball.xhtml
Ligne : 69
si je supprime, juste pour essai, le \+, je n'ai pas cette erreur, j'en
déduis que le \+ a créé l'erreur.
je vais alors sur le site :
<http://www.regular-expressions.info/javascriptexample.html>
où j'entre :
Regexp: " AppleWebKit/[^ ]+\+ " // sans les ""
Subject string: "10_4_11; fr) AppleWebKit/525+ (KHT"
là, le même firefox 3RC1 ne me donne pas d'erreur, et pourtant le code
de cette page donne :
function demoMatchClick() {
var re = new RegExp(document.demoMatch.regex.value);
if (document.demoMatch.subject.value.match(re)) {
alert("Successful match");
} else {
alert("No match");
}
}
avec document.demoMatch.regex.value ce qui est entré en face de
"Regexp:"
et document.demoMatch.subject.value ce qui est entré en face de "Subject
string:"
il me semble que mon code est "équivalent" enfin, comme il ne marche pas
je me doute bien qu'il y a une différence, mais je ne vois pas laquelle.
--
Une Bévue
ah oui on peut entrer une regexp dans new Regexp() ?
(pour employer a méthode déclarant la rexepr avant) (remettre en 1 seule ligne y compris les blancs)
ouais, bon, il y a des mystères ???
ce que je ne pige vraiment pas c'est mon essai sur le site <http://www.regular-expressions.info/javascriptexample.html>
car si je fais un copier/coller de son code ça ne marche plus.
ce que j'intuite est qu'une chaîne de caractères entrée comme "ma chaine" (directement dans le code js) n'est pas exactement la même chose que "la même" chaîne entrée (sans les "") dans un input text, lequel doit-être prévu pour POST|GET ???
même si dans le code html de la page en question il y a : <FORM ID="demoMatch" NAME="demoMatch" METHOD=POST ACTION="javascript:void(0)"> ------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^
un escaping behind the scene et non visible par un alert(), qqc dans le genre ???
-- Une Bévue
SAM <stephanemoriaux.NoAdmin@wanadoo.fr.invalid> wrote:
ha ben j'avais même pas regardé :
c'était bien une histoire de jeu, non ?
ah oui on peut entrer une regexp dans new Regexp() ?
(pour employer a méthode déclarant la rexepr avant)
(remettre en 1 seule ligne y compris les blancs)
ouais, bon, il y a des mystères ???
ce que je ne pige vraiment pas c'est mon essai sur le site
<http://www.regular-expressions.info/javascriptexample.html>
car si je fais un copier/coller de son code ça ne marche plus.
ce que j'intuite est qu'une chaîne de caractères entrée comme "ma
chaine" (directement dans le code js) n'est pas exactement la même chose
que "la même" chaîne entrée (sans les "") dans un input text, lequel
doit-être prévu pour POST|GET ???
même si dans le code html de la page en question il y a :
<FORM ID="demoMatch" NAME="demoMatch"
METHOD=POST ACTION="javascript:void(0)">
------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^
un escaping behind the scene et non visible par un alert(), qqc dans le
genre ???
ah oui on peut entrer une regexp dans new Regexp() ?
(pour employer a méthode déclarant la rexepr avant) (remettre en 1 seule ligne y compris les blancs)
ouais, bon, il y a des mystères ???
ce que je ne pige vraiment pas c'est mon essai sur le site <http://www.regular-expressions.info/javascriptexample.html>
car si je fais un copier/coller de son code ça ne marche plus.
ce que j'intuite est qu'une chaîne de caractères entrée comme "ma chaine" (directement dans le code js) n'est pas exactement la même chose que "la même" chaîne entrée (sans les "") dans un input text, lequel doit-être prévu pour POST|GET ???
même si dans le code html de la page en question il y a : <FORM ID="demoMatch" NAME="demoMatch" METHOD=POST ACTION="javascript:void(0)"> ------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^
un escaping behind the scene et non visible par un alert(), qqc dans le genre ???
-- Une Bévue
SAM
SAM wrote:
ha ben j'avais même pas regardé : c'était bien une histoire de jeu, non ?
de jeu ? je ne pige pas de quel jeu il s'agit...
match
faut suivre mon humour pas très de haut vol :-)
ce que je ne pige vraiment pas c'est mon essai sur le site <http://www.regular-expressions.info/javascriptexample.html>
car si je fais un copier/coller de son code ça ne marche plus.
pourtant si tu y faits : javascript:alert('['+document.demoMatch.regex.value+']'); c'est bien ça qu'il y a dans le champ : " AppleWebKit/[^ ]++ "
maintenant, comme il fait : var re = new RegExp(document.demoMatch.regex.value); c'est peut-être équivalent à : var re = new RegExp( AppleWebKit/[^ ]++ ); ou : var re = new RegExp(/ AppleWebKit/[^ ]++ /);
un escaping behind the scene et non visible par un alert(), qqc dans le genre ???
SAM <stephanemoriaux.NoAdmin@wanadoo.fr.invalid> wrote:
ha ben j'avais même pas regardé :
c'était bien une histoire de jeu, non ?
de jeu ? je ne pige pas de quel jeu il s'agit...
match
faut suivre mon humour pas très de haut vol :-)
ce que je ne pige vraiment pas c'est mon essai sur le site
<http://www.regular-expressions.info/javascriptexample.html>
car si je fais un copier/coller de son code ça ne marche plus.
pourtant si tu y faits :
javascript:alert('['+document.demoMatch.regex.value+']');
c'est bien ça qu'il y a dans le champ : " AppleWebKit/[^ ]++ "
maintenant, comme il fait :
var re = new RegExp(document.demoMatch.regex.value);
c'est peut-être équivalent à :
var re = new RegExp( AppleWebKit/[^ ]++ );
ou :
var re = new RegExp(/ AppleWebKit/[^ ]++ /);
un escaping behind the scene et non visible par un alert(), qqc dans le
genre ???
ha ben j'avais même pas regardé : c'était bien une histoire de jeu, non ?
de jeu ? je ne pige pas de quel jeu il s'agit...
match
faut suivre mon humour pas très de haut vol :-)
ce que je ne pige vraiment pas c'est mon essai sur le site <http://www.regular-expressions.info/javascriptexample.html>
car si je fais un copier/coller de son code ça ne marche plus.
pourtant si tu y faits : javascript:alert('['+document.demoMatch.regex.value+']'); c'est bien ça qu'il y a dans le champ : " AppleWebKit/[^ ]++ "
maintenant, comme il fait : var re = new RegExp(document.demoMatch.regex.value); c'est peut-être équivalent à : var re = new RegExp( AppleWebKit/[^ ]++ ); ou : var re = new RegExp(/ AppleWebKit/[^ ]++ /);
un escaping behind the scene et non visible par un alert(), qqc dans le genre ???
en effet, et fort des démos de Moz, on n'a même pas besoin de RegExp() : javascript:alert(navigator.userAgent.match(/ AppleWebKit/[^ ]++ /)); comme tu l'as fait en dernier ressort
remarques que JSLint conseille, de toujours utiliser les valeurs littérales en js, par ex :
var monArray=new Array();
JSLint conseille, la déclaration littérale : var monArray=[];
je n'ai pas pigé pourquoi...
ce serait du même ordre avec RegExp, vaut mieux écrire comme le fait moz :
var re=/mon expression/
remarques, d'un côté "c'est + sûr", je trouve, pour moi en tout cas, car j'ai trouvé un petit problème dans mon expression, reprenons :
var re=new RegExp(" AppleWebKit/[^ ]++ "); -------------------------------------^----- là j'ai mis un "" parce qu'il en faut un quand j'écris l'expression ainsi :
var re=/ AppleWebKit/[^ ]++ /; --------------------^------^---- deux "" ici donc ce n'est pas cohérent, c'est pourquoi j'ai pensé tout de suite que la réponse d'Olivier était la bonne :
var re=new RegExp(" AppleWebKit/[^ ]++ "); -------------------------------------^^----- et là, ce qui est "escapé" ce n'est pas "+" mais le second ""...
isn't it ?
remarques que Webkit me donne aussi une erreur (moins bien formulée/précisée qu'avec Firefox) dans le premier cas,
dans le second Safari n'est pas géné dans le premier :
il me renvoie "AppleWebKit/419.3" au lieu de "null"
donc cette histoire de "" au lieu de // doit compter dans une RegExp
Olivier ? Pierre ? où êtes-vous ?
morale de cette histoire : => toujours utiliser /mon expression/ comme le fait moz... -- Une Bévue
SAM <stephanemoriaux.NoAdmin@wanadoo.fr.invalid> wrote:
en effet, et fort des démos de Moz, on n'a même pas besoin de RegExp() :
javascript:alert(navigator.userAgent.match(/ AppleWebKit/[^ ]++ /));
comme tu l'as fait en dernier ressort
remarques que JSLint conseille, de toujours utiliser les valeurs
littérales en js, par ex :
var monArray=new Array();
JSLint conseille, la déclaration littérale :
var monArray=[];
je n'ai pas pigé pourquoi...
ce serait du même ordre avec RegExp, vaut mieux écrire comme le fait moz
:
var re=/mon expression/
remarques, d'un côté "c'est + sûr", je trouve, pour moi en tout cas, car
j'ai trouvé un petit problème dans mon expression, reprenons :
var re=new RegExp(" AppleWebKit/[^ ]++ ");
-------------------------------------^-----
là j'ai mis un "" parce qu'il en faut un quand j'écris l'expression
ainsi :
var re=/ AppleWebKit/[^ ]++ /;
--------------------^------^----
deux "" ici donc ce n'est pas cohérent, c'est pourquoi j'ai pensé tout
de suite que la réponse d'Olivier était la bonne :
var re=new RegExp(" AppleWebKit/[^ ]+\+ ");
-------------------------------------^^-----
et là, ce qui est "escapé" ce n'est pas "+" mais le second ""...
isn't it ?
remarques que Webkit me donne aussi une erreur (moins bien
formulée/précisée qu'avec Firefox) dans le premier cas,
dans le second Safari n'est pas géné
dans le premier :
en effet, et fort des démos de Moz, on n'a même pas besoin de RegExp() : javascript:alert(navigator.userAgent.match(/ AppleWebKit/[^ ]++ /)); comme tu l'as fait en dernier ressort
remarques que JSLint conseille, de toujours utiliser les valeurs littérales en js, par ex :
var monArray=new Array();
JSLint conseille, la déclaration littérale : var monArray=[];
je n'ai pas pigé pourquoi...
ce serait du même ordre avec RegExp, vaut mieux écrire comme le fait moz :
var re=/mon expression/
remarques, d'un côté "c'est + sûr", je trouve, pour moi en tout cas, car j'ai trouvé un petit problème dans mon expression, reprenons :
var re=new RegExp(" AppleWebKit/[^ ]++ "); -------------------------------------^----- là j'ai mis un "" parce qu'il en faut un quand j'écris l'expression ainsi :
var re=/ AppleWebKit/[^ ]++ /; --------------------^------^---- deux "" ici donc ce n'est pas cohérent, c'est pourquoi j'ai pensé tout de suite que la réponse d'Olivier était la bonne :
var re=new RegExp(" AppleWebKit/[^ ]++ "); -------------------------------------^^----- et là, ce qui est "escapé" ce n'est pas "+" mais le second ""...
isn't it ?
remarques que Webkit me donne aussi une erreur (moins bien formulée/précisée qu'avec Firefox) dans le premier cas,
dans le second Safari n'est pas géné dans le premier :
il me renvoie "AppleWebKit/419.3" au lieu de "null"
donc cette histoire de "" au lieu de // doit compter dans une RegExp
Olivier ? Pierre ? où êtes-vous ?
morale de cette histoire : => toujours utiliser /mon expression/ comme le fait moz... -- Une Bévue
unbewusst.sein
Olivier Miakinen <om+ wrote:
Probablement parce que, « + » n'étant pas un caractère spécial pour les chaînes de caractères, « + » est équivalent à « + », et ta chaîne est donc équivalente à " AppleWebKit/[^ ]++ ".
Essaye avec : " AppleWebKit/[^ ]++ "
ouais ça roule comme ça !
et comment tu expliquerais que la chaîne :
" AppleWebKit/[^ ]++ " entrée dans un input text sur le site cité + haut ne donne pas d'erreur ? ET fonctionne très bien.
perso je suppute, comme ton conseil semble le confirmer, qu'il y a, à la lecture de cet input par js un escaping fait derrière mon dos et que je ne vois pas quand je fais un alert sur la valeur retournée par cet input text ?
qqc dans ce goût-là ?
m'enfin c'est sournois, en tout cas le site où l'on peux tester une RegExp est à prendre avec des pincettes, compte-tenu de cette expérience... -- Une Bévue
Olivier Miakinen <om+news@miakinen.net> wrote:
Probablement parce que, « + » n'étant pas un caractère spécial pour les
chaînes de caractères, « + » est équivalent à « + », et ta chaîne est
donc équivalente à " AppleWebKit/[^ ]++ ".
Essaye avec : " AppleWebKit/[^ ]+\+ "
ouais ça roule comme ça !
et comment tu expliquerais que la chaîne :
" AppleWebKit/[^ ]++ " entrée dans un input text sur le site cité +
haut ne donne pas d'erreur ? ET fonctionne très bien.
perso je suppute, comme ton conseil semble le confirmer, qu'il y a, à la
lecture de cet input par js un escaping fait derrière mon dos et que je
ne vois pas quand je fais un alert sur la valeur retournée par cet input
text ?
qqc dans ce goût-là ?
m'enfin c'est sournois, en tout cas le site où l'on peux tester une
RegExp est à prendre avec des pincettes, compte-tenu de cette
expérience...
--
Une Bévue
Probablement parce que, « + » n'étant pas un caractère spécial pour les chaînes de caractères, « + » est équivalent à « + », et ta chaîne est donc équivalente à " AppleWebKit/[^ ]++ ".
Essaye avec : " AppleWebKit/[^ ]++ "
ouais ça roule comme ça !
et comment tu expliquerais que la chaîne :
" AppleWebKit/[^ ]++ " entrée dans un input text sur le site cité + haut ne donne pas d'erreur ? ET fonctionne très bien.
perso je suppute, comme ton conseil semble le confirmer, qu'il y a, à la lecture de cet input par js un escaping fait derrière mon dos et que je ne vois pas quand je fais un alert sur la valeur retournée par cet input text ?
qqc dans ce goût-là ?
m'enfin c'est sournois, en tout cas le site où l'on peux tester une RegExp est à prendre avec des pincettes, compte-tenu de cette expérience... -- Une Bévue
javascript:var n=/ AppleWebKit/[^ ]++ /;alert(n);alert(navigator.userAgent.match(n)); OK
le truc d'Olivier me semble compromis là dans ce cas.
-- sm
unbewusst.sein
SAM wrote:
pourtant si tu y faits : javascript:alert('['+document.demoMatch.regex.value+']'); c'est bien ça qu'il y a dans le champ : " AppleWebKit/[^ ]++ "
maintenant, comme il fait : var re = new RegExp(document.demoMatch.regex.value); c'est peut-être équivalent à : var re = new RegExp( AppleWebKit/[^ ]++ ); ou : var re = new RegExp(/ AppleWebKit/[^ ]++ /);
un escaping behind the scene et non visible par un alert(), qqc dans le genre ???
mouais, avec un document.write tu as peut-être aussi une traduction des séquences d'escape, que tu ne vois pas... -- Une Bévue
SAM <stephanemoriaux.NoAdmin@wanadoo.fr.invalid> wrote:
pourtant si tu y faits :
javascript:alert('['+document.demoMatch.regex.value+']');
c'est bien ça qu'il y a dans le champ : " AppleWebKit/[^ ]++ "
maintenant, comme il fait :
var re = new RegExp(document.demoMatch.regex.value);
c'est peut-être équivalent à :
var re = new RegExp( AppleWebKit/[^ ]++ );
ou :
var re = new RegExp(/ AppleWebKit/[^ ]++ /);
un escaping behind the scene et non visible par un alert(), qqc dans le
genre ???
pourtant si tu y faits : javascript:alert('['+document.demoMatch.regex.value+']'); c'est bien ça qu'il y a dans le champ : " AppleWebKit/[^ ]++ "
maintenant, comme il fait : var re = new RegExp(document.demoMatch.regex.value); c'est peut-être équivalent à : var re = new RegExp( AppleWebKit/[^ ]++ ); ou : var re = new RegExp(/ AppleWebKit/[^ ]++ /);
un escaping behind the scene et non visible par un alert(), qqc dans le genre ???
mouais, avec un document.write tu as peut-être aussi une traduction des séquences d'escape, que tu ne vois pas... -- Une Bévue
unbewusst.sein
SAM wrote:
Essaye avec : " AppleWebKit/[^ ]++ "
J'aurais bien proposé ça mais ... ça n'explique pas pourquoi :
/ AppleWebKit/[^ ]++ /
n'a pas besoin de ce +
ben là, si c'est facile à comprendre "/" doit-être escapé au même titre que "+".
tandis que dans :
" AppleWebKit/[^ ]++ "
ce qui est escapé par le premier "" c'est le second "" et non pas le "+" ce qui permet au compilateur de RegExp de piger, ceci dit il devrait alors pouvoir comprendre :
new RegExp(" AppleWebKit/[^ ]++ ") non ? ce qui n'est pas le cas, ça veut dire qu'implicitement, comme le suggère Olivier, quand il n'y a qu'un seul "" dans une chaine et à un endroit où il n'est pas nécessaire, c'est comme si il n'y était pas.
c'est très simple en fait, c'est une histoire à la Pieplu (shadock)
;-)
bon moi je retiens que finalement c'est plus simple d'utiliser // et moins sujet à confusion. -- Une Bévue
SAM <stephanemoriaux.NoAdmin@wanadoo.fr.invalid> wrote:
Essaye avec : " AppleWebKit/[^ ]+\+ "
J'aurais bien proposé ça mais ... ça n'explique pas pourquoi :
/ AppleWebKit/[^ ]++ /
n'a pas besoin de ce \+
ben là, si c'est facile à comprendre "/" doit-être escapé au même titre
que "+".
tandis que dans :
" AppleWebKit/[^ ]+\+ "
ce qui est escapé par le premier "" c'est le second "" et non pas le
"+" ce qui permet au compilateur de RegExp de piger, ceci dit il devrait
alors pouvoir comprendre :
new RegExp(" AppleWebKit/[^ ]++ ") non ?
ce qui n'est pas le cas, ça veut dire qu'implicitement, comme le suggère
Olivier, quand il n'y a qu'un seul "" dans une chaine et à un endroit
où il n'est pas nécessaire, c'est comme si il n'y était pas.
c'est très simple en fait, c'est une histoire à la Pieplu (shadock)
;-)
bon moi je retiens que finalement c'est plus simple d'utiliser // et
moins sujet à confusion.
--
Une Bévue
J'aurais bien proposé ça mais ... ça n'explique pas pourquoi :
/ AppleWebKit/[^ ]++ /
n'a pas besoin de ce +
ben là, si c'est facile à comprendre "/" doit-être escapé au même titre que "+".
tandis que dans :
" AppleWebKit/[^ ]++ "
ce qui est escapé par le premier "" c'est le second "" et non pas le "+" ce qui permet au compilateur de RegExp de piger, ceci dit il devrait alors pouvoir comprendre :
new RegExp(" AppleWebKit/[^ ]++ ") non ? ce qui n'est pas le cas, ça veut dire qu'implicitement, comme le suggère Olivier, quand il n'y a qu'un seul "" dans une chaine et à un endroit où il n'est pas nécessaire, c'est comme si il n'y était pas.
c'est très simple en fait, c'est une histoire à la Pieplu (shadock)
;-)
bon moi je retiens que finalement c'est plus simple d'utiliser // et moins sujet à confusion. -- Une Bévue