RegExp détecter s*background

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
unbewusst.sein
Le #722683
Une Bévue

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

Elegie
Le #724929
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:


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.


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(
"[{;][\s\r\n\f]*" +
p +
"[\s\r\n\f]*:[\s\r\n\f]*" +
"([^};]*)" ,
"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.

unbewusst.sein
Le #724652
Elegie
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:



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




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(
"[{;][\s\r\n\f]*" +
p +
"[\s\r\n\f]*:[\s\r\n\f]*" +
"([^};]*)" ,
"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à :


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


kurtz le pirate
Le #724648
In article (Une Bévue) wrote:

Une Bévue

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


unbewusst.sein
Le #724647
kurtz le pirate
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

ASM
Le #724403

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é

Olivier Miakinen
Le #724402

" "(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} ? ;-)


ASM
Le #724398
" "(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
:
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é



Olivier Miakinen
Le #724394

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

ASM
Le #724115

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é

Publicité
Poster une réponse
Anonyme