2009-10-24 4 views
0

Я хочу просмотреть файл css и захватить как комментарии, так и css. Я придумал регулярное выражение, что это почти там, однако это не совсем совершенна, как он пропускает свойства с несколько объявлений, то естьParsing 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

+1

Вы можете определить, какой выход вы хотите? «вы хотите, чтобы css и комментарии» были глобальными, чтобы определить, что вы хотите. укажите массив какого-то типа –

+0

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

ответ

6

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

удалить все новые строки, и он будет в безопасности! – mauris

+0

@Mauris, тогда будет единственная строка. –

+1

@ Маурис он не будет. просто подумайте о «{« внутренних комментариях, строках »... он обязательно должен пойти со специализированным парсером css. –

0

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

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

+0

Я использую PHP, и preg_match_all – Damian

+2

@Damian: теперь есть парсер PHP. – PhiLho

Смежные вопросы