php用正则表达式获取css

我正在尝试使用regexp获取css选择器+样式但总是存在问题... </ p>

所以你对regexp有一个想法(例如?)吗:</ p>

  array(
[0] =&gt; “div {
background:red;
color:blue;
}”,
[1] =&gt;“section {
/ * comment with bad idea}&lt; - this break regexp [^}] + * /
背景:蓝色;
颜色:红色;
}“
);
</ code> </ pre>

这个css:</ p>

<前> div {
背景:红色;
颜色:蓝色;
}

section {
/ *带坏主意的评论}&lt; - 此中断正则表达式[^}] + * /
背景:蓝色;
颜色:红色;
}
</ code> </ pre>

Thx </ p>
</ div>

展开原文

原文

I'm trying to get css selector + styles with a regexp but there is always a problem...

So do you have an idea (exemple ?) of a regexp do get this:

array(
[0] => "div {
    background: red;
    color: blue;
}",
[1] => "section {
    /* comment with bad idea } <- this break regexp [^}]+ */
    background: blue;
    color: red;
}"
);

fom this css:

div {
    background: red;
    color: blue;
}

section {
    /* comment with bad idea } <- this break regexp [^}]+ */
    background: blue;
    color: red;
}

Thx

duandai6373
duandai6373 使用sabberworm/PHP-CSS-Parser解析css文件的可能重复
接近 7 年之前 回复
doujiang2020
doujiang2020 xkcd.com/1171足够清楚了
接近 7 年之前 回复
douba4933
douba4933 我将从GooglingPHPParseCSS开始,查看可用的解决方案,看看它们是否足够智能以捕捉这种情况
接近 7 年之前 回复

3个回答



我终于以另一种方式做到了。
首先,我首先用这些正则表达式引用不需要的符号</ p>
\ n

  string = string 
.replace(/(')([^'] *)(')/ ig,function(found){

return found.replace(/([\ [] \ s \,\#\。\:\&gt; \〜])/ ig,“\ / \ / $ 1 \\”);

})
.replace(/(\ “)([^ \”] *)(\“)/ ig,function(找到){

返回found.replace(/([\ [] \ s \,\#\。\:\&\ gt ; \〜])/ ig,“\ / \ / $ 1 \\”);

});
</ code> </ pre>

然后,我拆分了 字符串与另一个正则表达式:</ p>

  string = string.split(/(?!\ / \ /)([\ s \&gt; \,])(?!\  \)| [\#\ \ [\(=(\ / \ /?!):(?!\\)])/ IG); 
</代码> </ PRE>

并且,要完成, if(string [x] .match(/ ^ [az] + $ / ig)){..}; </ code>它是一个tagName </ p>

如果你看到不好的东西,我正在听你的话。</ p>

编辑:</ p>

Oups!我忘记了答案 关于php,对不起。但我对php应用相同的方法,除了lookBefore简化并将regexp减少到只有一个,然后拆分... </ p>

J </ p>
< / DIV>

展开原文

原文

I finally did it by another way. First, I start by quoting the undesired symbols with these regex

string = string
.replace(/(')([^']*)(')/ig, function(found){

    return found.replace(/([\[\]\s\,\#\.\:\>\~])/ig, "\/\/$1\\\\");

})
.replace(/(\")([^\"]*)(\")/ig, function(found){

    return found.replace(/([\[\]\s\,\#\.\:\>\~])/ig, "\/\/$1\\\\");

});

Then, I split the string with another regexp:

string = string.split(/(?!\/\/)([\s\>\,])(?!\\\\)|(?=(?!\/\/)[\#\.\[\:](?!\\\\))/ig);

And, to finish, if( string[x].match(/^[a-z]+$/ig) ){..}; it is a tagName

If you see something bad, I'm listening to you.

Edit :

Oups ! I forgot my answer was about php, sorry. But I apply the same method for php, except lookBefore simplify and reduce the regexp to only one, then split...

J



如何:</ p>

  \ S + \ s * {(。*?)  }(?![^ *] * \ * /)
</ code> </ pre>

RegExr示例 </ p>

说明:</ strong> </ p>

  \ S + \ s 将您的选择器设为正则表达式 代替这个
{(。
?)}懒惰匹配一切到}
(?![^ ] * \ * /)检查下一个之后的}是不是* / \的开头 n </ code> </ pre>

这与完全注释掉的样式不匹配。 例如 / * div {...} * / </ code>但不清楚在这种情况下你想要发生什么。</ p>

继续使用你正在使用的任何东西 匹配选择器而不是 \ S + \ s * </ code>(我刚才用的例子)。 </ p>
</ div>

展开原文

原文

How about:

\S+\s*{(.*?)}(?![^*]*\*/)

RegExr Example

Explanation:

\S+\s*       put your selector regex in place of this 
{(.*?)}      lazy match everything to a } 
(?![^*]*\*/) check that the next * after the } is not the start of a */

This will not match styles that are completely commented out. e.g /* div { ... } */ but it's unclear what you would want to happen in this case anyway.

Keep using whatever you're using to match the selectors instead of \S+\s* (which I just used for examples sake).

dongwenyou4298
dongwenyou4298 嘿乔丹,我认为/ *假选择器{} * /不属于另一种风格。 你是对的,这打破了正则表达式。 tntu是正确的,试图在正则表达式中实现这一点已被证明是徒劳的 - 我已经尝试了各种各样的。 包含{在这种情况下(或在其他情况下)的正则表达式之外的注释打破了我能想到的每个变体:(
接近 7 年之前 回复
dsxi70423
dsxi70423 你可能不是太远...我preg_split保持分隔符,所以我删除了“(”&“)”\ S + \ s * {。*?}(?![^ *] ** /)现在,我的问题是 “/ *假选择器{} * /”
接近 7 年之前 回复



正则表达式将始终失败,因为注释中包含} </ code>。</ p>
\ n

只有运行一个正则表达式才能删除匹配样式的注释之前的所有注释。</ p>
</ div>

展开原文

原文

Regular expression will always fail because you have the } inside the comment.

It would only work if you ran a regular expression that removes all comments before the one that matches the styles.

dongxinjun3944
dongxinjun3944 如果有效,请告诉我们。
接近 7 年之前 回复
doudian7996
doudian7996 半信心我可能找到了解决方案。
接近 7 年之前 回复
dongshenyu4638
dongshenyu4638 据我所知,PHP无法做到这一点。 Perl可以。 但这是一个PHP问题。
接近 7 年之前 回复
douan7529
douan7529 具有命名子例程的递归正则表达式可以。 但是,现成的解析器的工作量要少得多。
接近 7 年之前 回复
duanfang2708
duanfang2708 其实不,你不能。 因为正则表达式虽然是一个很好的工具,但在某些方面仍然有限。 如果他决定评论整个风格,或者谁知道,该怎么办? 正则表达式不适合这种事情。 他最好使用解析器。 谷歌:php css解析器。
接近 7 年之前 回复
doufei9805
doufei9805 可以构造一个理解声明之间的注释的正则表达式。 这只是不合理的努力。
接近 7 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐