3

我以为这会很简单,但我现在已经为此苦苦挣扎了一段时间。我知道那里有 CSS 解析器类可以实现我想要做的......但我不需要它们所拥有的 95% 的功能,所以它们并不是真正可行的,而且太重了。

我需要做的就是通过正则表达式提取 CSS 文件中使用的任何类和/或 ID 名称。这是我认为可行的正则表达式,但没有。

[^a-z0-9][\w]*(?=\s)

当针对我的样本运行时:

.stuffclass {
 color:#fff;
 background:url('blah.jpg');
}
.newclass{
 color:#fff;
 background:url('blah.jpg');
}
.oldclass {
 color:#fff;
 background:url('blah.jpg');
}
#blah.newclass {
 color:#fff;
 background:url('blah.jpg');
}
.oldclass#blah{
 color:#fff;
 background:url('blah.jpg');
}
.oldclass #blah {
 color:#fff;
 background:url('blah.jpg');
}
.oldclass .newclass {
 text-shadow:1px 1px 0 #fff;
 color:#fff;
 background:url('blah.jpg');
}
.oldclass:hover{
 color:#fff;
 background:url('blah.jpg');
}
.newclass:active {
 text-shadow:1px 1px 0 #000;
}

它确实符合我想要的大部分内容,但它也包括大括号并且与 ID 不匹配。连接时我需要分别匹配 ID 和类。所以基本上#blah.newclass将是 2 个单独的匹配项:#blahAND .newclass

有任何想法吗?

====================

最终解决方案

我最终使用 2 个正则表达式首先去除了 and 之间的所有内容{}然后根据剩余的输入简单地匹配选择器。

这是一个完整的工作示例:

//Grab contents of css file
$file = file_get_contents('css/style.css');

//Strip out everything between { and }
$pattern_one = '/(?<=\{)(.*?)(?=\})/s';

//Match any and all selectors (and pseudos)
$pattern_two = '/[\.|#][\w]([:\w]+?)+/';

//Run the first regex pattern on the input
$stripped = preg_replace($pattern_one, '', $file);

//Variable to hold results
$selectors = array();

//Run the second regex pattern on $stripped input
$matches = preg_match_all($pattern_two, $stripped, $selectors);

//Show the results
print_r(array_unique($selectors[0]));
4

4 回答 4

1
[^a-z0-9][\w]+(?=\s)

我将您的 * 更改为 + 匹配

它在 RegEXR 中运行良好 - 一个很棒的正则表达式开发工具:http ://gskinner.com/RegExr/ (参见窗口右下角下载桌面版本)

于 2012-05-18T14:43:01.997 回答
1

此版本基于 nealio82,但添加了伪选择器: [^a-z0-9][\w:-]+(?=\s)

于 2019-03-26T05:35:28.470 回答
0
/(?<!:\s)[#.][\w]*/

像这样的东西?不包括#FFFFFF 颜色的东西......

于 2012-05-18T14:43:42.570 回答
0

OP 发布的解决方案有效,但它不适用于带有连字符的 CSS 类。因此,我修改了第二种模式以更有效地工作:

$pattern_two = '/[\.|#]([A-Za-z0-9_\-])*(\s?)+/';
于 2017-03-21T14:24:11.627 回答