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

RegExp détecter s*background

10 réponses
Avatar
unbewusst.sein
manipulant des css rules, j'ai besoin de détecter "background dans une
chaine qui peut avoir les formes suivantes :

background: <les attributs> // pas d'espace en 1ier caractère
background: <les attributs> // une espace en 1ier caractère

et ne pas détecter des chaines de la forme :

-moz-background-clip: < attributs>

si j'utilise :

var rgx=new RegExp("\s"+property+":");

property étant le paramètre de ma function qui vaut dans ce cas
background.

ça roule

de même :

var rgx=new RegExp(property+":");

MAIS :

var rgx=new RegExp("^\s*"+property+":");

ne détecte pas :
background: // une espace en 1ier caractère
mais détecte bien :
background: // pas d'espace.

maintenant si je fais cette manip à l'adresse :

<http://www.regular-expressions.info/javascriptexample.html>

en entrant :
Regexp: ^\*background:
Subject string: background: (avec ou sans espace au début)

ça marche toujours...

ça me donne l'impression que le caractère "^" est interprété
différemment...

--
Une Bévue

10 réponses

Avatar
unbewusst.sein
Une Bévue wrote:


var rgx=new RegExp("^s*"+property+":");


entretemps j'ai procédé à un autre essai de RegExp :

var rgx=new RegExp("^ *"+property+":");

et là ça roule dans tous mes cas, c'est donc le "s" qui pose pb ???
--
Une Bévue

Avatar
Elegie
Une Bévue wrote:

Bonjour,

manipulant des css rules,


Juste avant de poursuivre, je vous invite à consulter, si d'aventure
elles vous étaient inconnues, les entrées des archives
comp.lang.javascript pour "currentStyle" et "getComputedStyle".

La spécification DOM Styles se trouve ici:

<URL:http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113/>

j'ai besoin de détecter "background dans une
chaine qui peut avoir les formes suivantes :

background: <les attributs> // pas d'espace en 1ier caractère
background: <les attributs> // une espace en 1ier caractère

et ne pas détecter des chaines de la forme :

-moz-background-clip: < attributs>


Le parsing que vous souhaitez faire s'accordera, j'imagine, avec le
style CSS que vous employez. Toutefois, sachez que la syntaxe CSS permet
quelques subtilités qui, si employées, pourraient rendre une telle
détection beaucoup plus ardue à opérer.

<URL:http://www.w3.org/TR/CSS21/syndata.html>

Le fonction suivante devrait répondre aux besoins les plus courants.
Néanmoins, sa robustesse pourra être améliorée en portant une attention
particulière aux chaînes CSS ou caractères "{", à l'aide des techniques
de substitution que nous avons vues avec le "javascript highlighter", il
y a peu.

---
function getPropertyValue(s,p) {
var v=[],a,re=new RegExp(
"[{;][srnf]*" +
p +
"[srnf]*:[srnf]*" +
"([^};]*)" ,
"gi"
);
s=s.replace(//*([^*]|(*+[^*/]))**+//g,"");
while((a=re.exec(s))!=null) {
v.push(a[1].replace(/^[srnf]+|[srnf]+$/,""));
}
return v;
}
---

si j'utilise :

var rgx=new RegExp("s"+property+":");


Le caractère "" sert à "échapper" des entités, à la fois dans une
chaîne et dans une expression régulière. Dans l'expression RegExp(...),
il vous faut donc le doubler: RegExp("s");


Cheers,
Elegie.

Avatar
unbewusst.sein
Elegie wrote:

Juste avant de poursuivre, je vous invite à consulter, si d'aventure
elles vous étaient inconnues, les entrées des archives
comp.lang.javascript pour "currentStyle" et "getComputedStyle".

La spécification DOM Styles se trouve ici:

<URL:http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113/>


<snip />

Le parsing que vous souhaitez faire s'accordera, j'imagine, avec le
style CSS que vous employez. Toutefois, sachez que la syntaxe CSS permet
quelques subtilités qui, si employées, pourraient rendre une telle
détection beaucoup plus ardue à opérer.

<URL:http://www.w3.org/TR/CSS21/syndata.html>



merci pour les refs, en effet je procède en deux temps :

je recherche en premier lieu le "selector" en balayant tous les rules ;
puis je découpe les propriétés en me basant sur ";" ;
enfin je détecte la propriété correspondante et je change sa valeur :

function changeRule(selector,property,value){
var rgx=new RexgExp("^s*"+property+"s*:");
var rules=document.styleSheets[0].cssRules;
for(var i=0;i<rules.length;i++){
// selector selection
if(rules[i].selectorText === selector){
//split properties according to ";"
var cssTexts=rules[i].style.cssTest.split(";");
// look for the right property
for(var j=0;j<cssTexts.length;j++){
if(rgx.test(cssTexts[j])){
cssTexts[j]=property+':'+value;
}
}
// restore the whole rule
rules[i].style.cssText=cssTexts.join(';');
return true; // selector & property found
}
}
return false; // no change
}


Le fonction suivante devrait répondre aux besoins les plus courants.
Néanmoins, sa robustesse pourra être améliorée en portant une attention
particulière aux chaînes CSS ou caractères "{", à l'aide des techniques
de substitution que nous avons vues avec le "javascript highlighter", il
y a peu.

---
function getPropertyValue(s,p) {
var v=[],a,re=new RegExp(
"[{;][srnf]*" +
p +
"[srnf]*:[srnf]*" +
"([^};]*)" ,
"gi"
);
s=s.replace(//*([^*]|(*+[^*/]))**+//g,"");
while((a=re.exec(s))!=null) {
v.push(a[1].replace(/^[srnf]+|[srnf]+$/,""));
}
return v;
}
---

si j'utilise :

var rgx=new RegExp("s"+property+":");


Le caractère "" sert à "échapper" des entités, à la fois dans une
chaîne et dans une expression régulière. Dans l'expression RegExp(...),
il vous faut donc le doubler: RegExp("s");


ben oui, c'est là mon erreur ))))

merci bien pour les refs et le "" ;-)

mon bout d'essai est là :

<http://www.yvon-thoraval.com/Events/event_listenet.xhtml>

j'y log les deux changement opérés par changeRule()
--
Une Bévue


Avatar
kurtz le pirate
In article <1hupbr6.19jpefm110oc28N%,
(Une Bévue) wrote:

Une Bévue wrote:


var rgx=new RegExp("^s*"+property+":");


entretemps j'ai procédé à un autre essai de RegExp :

var rgx=new RegExp("^ *"+property+":");

et là ça roule dans tous mes cas, c'est donc le "s" qui pose pb ???


vite fait des regexpr perl :

" "(espace) et "s" ne représente pas les mêmes choses...
"*" : reconnaissance pour zéro fois ou plus.
"+" : reconnaissance pour 1 fois ou plus.



--
klp


Avatar
unbewusst.sein
kurtz le pirate wrote:

vite fait des regexpr perl :

" "(espace) et "s" ne représente pas les mêmes choses...
"*" : reconnaissance pour zéro fois ou plus.
"+" : reconnaissance pour 1 fois ou plus.


oui, oui, je suis d'accord, merci !

en fait, dans mes cas de figure le s est très certainement
surdimensionné, je ne devrais avoir que des espaces.

mon pb était que j'entrais s dans une string entre "" et là il faut
escaper le de s d'où écrire :

var rgx=new RegExp("^s*"+property+"s*:");

et là, ca roule )))
--
Une Bévue

Avatar
ASM

vite fait des regexpr perl :

" "(espace) et "s" ne représente pas les mêmes choses...
"*" : reconnaissance pour zéro fois ou plus.
"+" : reconnaissance pour 1 fois ou plus.


et pour zéro fois ... y a rien :-(


--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé

Avatar
Olivier Miakinen

" "(espace) et "s" ne représente pas les mêmes choses...
"*" : reconnaissance pour zéro fois ou plus.
"+" : reconnaissance pour 1 fois ou plus.


et pour zéro fois ... y a rien :-(


{0} ou {0,0} ? ;-)


Avatar
ASM
" "(espace) et "s" ne représente pas les mêmes choses...
"*" : reconnaissance pour zéro fois ou plus.
"+" : reconnaissance pour 1 fois ou plus.
et pour zéro fois ... y a rien :-(



{0} ou {0,0} ? ;-)


c'est touj pour mon idée d'exclusion
:<45e8bc58$0$25913$

regchaine = ">•(n|r)<•";

non
t = t.replace(/{>}(n|r|nr){<}/g,'<br>');
ne marche pas mieux
même pire : rien n'est remplacé

Là :
t = t.replace(/{[^>]}(n|r|nr){[^<]}/g,'<br>');
pareil

Ha! j'approche, j'approche :
t = t.replace(/>{0}(n|r|nr)<{0}/g,'<br>');
fait aussi bien que :
t = t.replace(/(n|r|nr)/g,'<br>');
c'est à dire cracra


--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé



Avatar
Olivier Miakinen

Ha! j'approche, j'approche :
t = t.replace(/>{0}(n|r|nr)<{0}/g,'<br>');
fait aussi bien que :
t = t.replace(/(n|r|nr)/g,'<br>');
c'est à dire cracra


Je n'ai pas encore tout lu de ce que tu cherches à faire, mais il est
possible que les assertions soient ce que tu cherches.

foo(?ºr) trouve un foo s'il est suivi par un bar
foo(?!bar) trouve un foo s'il n'est pas suivi par un bar
(?<=foo)bar trouve un bar s'il est précédé par un foo
(?<!foo)bar trouve un bar s'il n'est pas précédé par un foo

Avatar
ASM

Je n'ai pas encore tout lu de ce que tu cherches à faire, mais il est
possible que les assertions soient ce que tu cherches.

foo(?ºr) trouve un foo s'il est suivi par un bar
foo(?!bar) trouve un foo s'il n'est pas suivi par un bar
(?<=foo)bar trouve un bar s'il est précédé par un foo
(?<!foo)bar trouve un bar s'il n'est pas précédé par un foo


Ha! oui ! le dernier là ne m'a pas l'air mal.

Bien que je n'y comprenne rien
? caractère précédent (me dit-on qque part sur le net)
< le caractère à repérer (non ça doit pas être ça)
?< '<' le caractère précédent (la suite ?) ?
?< ... je sèche
! non (pas vu cette option là où j'ai fouillé, ni le = )

Mais où as-tu pu trouver ça ?

(non, non, par pitié pas une norme où il faut savoir lire les regexp
pour la déchiffrer ! ! !)

Je refouille mes marque-pages et pour les assertions, j'ai ça :
http://www.expreg.com/symbole.php
on n'y parle pas des "oubliés" < > ! De fil en aiguille j'arrive tt de même ici :
http://www.expreg.com/assertion2.php
où je lis : "Assertion arrière négative (?<!motif) "
Heueueu ! oui ?
à digérer tranquillement dès qu'on a compris la phrase :-)

--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé