Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

test regexp

39 réponses
Avatar
unbewusst.sein
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

10 réponses

1 2 3 4
Avatar
unbewusst.sein
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...

ceci a l'air de fonctionner aussi :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(navigator.userAgent.match(n));


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

Avatar
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 ???


je n'y vois rien d'escapé en faisant :

javascript:document.write('['+document.demoMatch.regex.value+']');document.close();

ni en faisant :

javascript:document.body.innerHTML=('['+document.demoMatch.regex.value+']');


--
sm


Avatar
unbewusst.sein
SAM 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 :

javascript:alert(navigator.userAgent.match(RegExp(' AppleWebKit/[^
]++ ')));

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


Avatar
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

Avatar
SAM

isn't it ?


j'en sais rien ...
J'ai une syntaxe error avec :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(navigator.userAgent.match(n));

ou :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(navigator.userAgent.match(n));

mais pas avec :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(navigator.userAgent.match(n));

comprenne qui pourra ...

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...


pas seulement, pas seulement ... si j'en crois les 3 trucs + haut

Ha! un dernier coup :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(n);alert(navigator.userAgent.match(n));

OK, me semble-ce.

--
sm


Avatar
SAM
Ha! un dernier coup :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(n);alert(navigator.userAgent.match(n));

OK, me semble-ce.


comme je réponds avant de lire (syntaxe à la Mozzarrelle)

voici :
javascript:var n=/ AppleWebKit/[^ ]++
/;alert(n);alert(navigator.userAgent.match(n));
error

javascript:var n=/ AppleWebKit/[^ ]++
/;alert(n);alert(navigator.userAgent.match(n));
error

javascript:var n=/ AppleWebKit/[^ ]++
/;alert(n);alert(navigator.userAgent.match(n));
OK

le truc d'Olivier me semble compromis là dans ce cas.

--
sm

Avatar
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 ???


je n'y vois rien d'escapé en faisant :

javascript:document.write('['+document.demoMatch.regex.value+']');
document.close();


ni en faisant :

javascript:document.body.innerHTML=('['+document.demoMatch.regex.value+']');


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


Avatar
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


Avatar
SAM
SAM wrote:

je n'y vois rien d'escapé en faisant :

javascript:document.write('['+document.demoMatch.regex.value+']');
document.close();

ni en faisant :

javascript:document.body.innerHTML=('['+document.demoMatch.regex.value+']');


mouais, avec un document.write tu as peut-être aussi une traduction des
séquences d'escape, que tu ne vois pas...


c'est pourquoi j'ai fait un innerHTML

mais ça revient peut-être à la même chose ?

le der de der :

javascript:var n=/ AppleWebKit/[^ ]++
/;document.body.innerHTML=n;alert(navigator.userAgent.match(n));alert(n);

J'ai mis les alerts après pour ne pas avoir de traduction dans son dos

--
sm


Avatar
unbewusst.sein
SAM wrote:

le truc d'Olivier me semble compromis là dans ce cas.


ben non, Olivier met un double escape devant le + dans une chaîne de
caractère pas dans une regexp entrée par //, ce n'est pas pareil !

dans une chaîne :
"+" le "" ne sert de rien car rien n'est à escaper.

par contre dans :
"+" le premier "" escape le second "" ce qui permet à la compil par
: new RegExp("...") de garder UN SEUL "" devant le second +.

CQFD )))

en tout cas, perso, je n'utiliserais jamais new RegExp( /une
expression/)...
--
Une Bévue

1 2 3 4