Разбор CSS с регулярным выражением - PullRequest
0 голосов
/ 24 октября 2009

Я хочу отсканировать файл css и записать как комментарии, так и css. Я придумал регулярное выражение, которое почти там, но оно не совсем идеально, так как оно пропускает свойства с несколькими объявлениями, т.е.

ul.menu li a, # Won't capture this line
ul.nice-menu li a { text-decoration: none; cursor:pointer; }

Вот регулярное выражение, с которым я работаю:

(\/\*[^.]+\*\/\n+)?([\t]*[a-zA-Z0-9\.# -_:@]+[\t\s]*\{[^}]+\})

Я тестировал это на rubular.com, и вот что он в данный момент соответствует, и как выглядит вывод массива.

Результат 1

[0] /* Index */
/*
GENERAL

PAGE REGIONS
- Header bar region
- Navigation bar region
- Footer region           
SECTION SPECIFIC
- Homepage
- News */

[1] html { background: #ddd; }

Результат 2

[0]
[1] body { background: #FFF; font-family: "Arial", "Verdana", sans-serif; color: #545454;}

Я должен отметить, что я все еще новичок, когда дело доходит до регулярных выражений, поэтому, если кто-то может помочь и показать, в чем я ошибаюсь, это будет высоко оценено :)

КСТАТИ: Я использую PHP и preg_match_all

Ответы [ 2 ]

6 голосов
/ 24 октября 2009

CSS не может быть полностью проанализирован с помощью регулярного выражения (см. Грамматика CSS: http://www.w3.org/TR/CSS2/grammar.html). Например, {...} можно разбить на строки, и ваша текущая версия не справится с этим. Если вам нужно чтобы сделать это, вы должны прочитать спецификацию CSS и использовать такой инструмент, как ANTLR, для генерации парсера.

Вот пример из спецификации W3C (http://www.w3.org/TR/CSS2/syndata.html):

@import "subs.css";
@import "print-main.css" print;
@media print {
  body { font-size: 10pt }
}
h1 {color: blue }

Нет нормального регулярного выражения, настолько мощного, чтобы иметь дело с вложенными {...} и т. Д. Не говоря уже о содержимом импортированных таблиц стилей.

0 голосов
/ 24 октября 2009

Какой язык вы используете?

Возможно, вам следует просто использовать библиотеку для разбора CSS. Библиотеки могут спасти вас от горя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...