【问题标题】:php get css with regexpphp用正则表达式获取css
【发布时间】:2013-11-27 16:38:08
【问题描述】:

我正在尝试使用正则表达式获取 css 选择器 + 样式,但总是有问题...

那么你有一个关于正则表达式的想法(例如?)吗:

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

从这个 css:

div {
    background: red;
    color: blue;
}

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

谢谢

【问题讨论】:

标签: php regex preg-match-all


【解决方案1】:

怎么样:

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

RegExr Example

说明:

\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 */

这将不匹配完全注释掉的样式。例如/* div { ... } */,但目前尚不清楚在这种情况下您希望发生什么。

继续使用你正在使用的任何东西来匹配选择器,而不是 \S+\s*(我只是为了示例而使用的)。

【讨论】:

  • 你可能不会太远...我 preg_split 保留分隔符,所以我删除了 "(" & ")" \S+\s*{.*?}(?![^*]* */) 现在,我的问题是 "/* fake selector {} */"
  • 嘿乔丹,我认为/* fake selector {} */ 不在另一种风格中。你是对的,这打破了正则表达式。 tntu 是正确的,试图在正则表达式中实现这一点已被证明是徒劳的——我已经尝试了各种方法。在这种情况下包含{(或在其他情况下为})的正则表达式之外的评论打破了我能想到的所有变化:(
【解决方案2】:

正则表达式总是会失败,因为你在评论中有}

只有当你运行一个正则表达式来删除匹配样式之前的所有 cmets 时,它才会起作用。

【讨论】:

  • 可以构造一个正则表达式来理解声明之间的 cmets。这只是不合理的努力。
  • 实际上不,你不能。因为正则表达式虽然是一个很好的工具,但在某些方面仍然受到限制。如果他决定评论整个风格怎么办,或者谁知道呢。正则表达式不适合这种事情。他最好使用解析器。谷歌:php css parser
  • 带有命名子程序的recursive regex 可以。但是,是的,现成的解析器的工作量要少得多。
  • 据我所知 PHP 做不到。 Perl 可以。但这是一个 PHP 问题。
  • @tntu, semi-相信我可能找到了解决方案。
【解决方案3】:

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

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

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

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

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

});

然后,我用另一个正则表达式拆分字符串:

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

最后,if( string[x].match(/^[a-z]+$/ig) ){..}; 是一个标签名

如果你看到不好的东西,我会听你的。

编辑:

哎呀!我忘了我的答案是关于 php 的,对不起。但是我对php应用了相同的方法,除了lookBefore简化并将正则表达式减少到只有一个,然后拆分......

J

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 2011-12-25
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2014-05-26
    相关资源
    最近更新 更多