Регулярное выражение, которое проверяет селектор CSS - PullRequest
0 голосов
/ 01 октября 2010

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

Допустимые селекторы:

EE
#myid
.class
.class.anotherclass
EE .class
EE .class EEE.anotherclass
EE[class="test"]
.class[alt~="test"]
#myid[alt="test"]
EE:hover
EE:first-child
E[lang|="en"]:first-child
EE#test .class>.anotherclass
EE#myid.classshit.anotherclass[class~="test"]:hover
EE#myid.classshit.anotherclass[class="test"]:first-child EE.Xx:hover

Неправильные селекторы, например содержать лишние пробелы в конце строки:

EE:hover   EE
EE .class EEE.anotherclass 
EE#myid.classshit.anotherclass[class="test"]:first-child EE.Xx:hov     9
EE#myid.classshit.anotherclass[class="test"]:first-child EE.Xx:hov  -daf

Ответы [ 3 ]

4 голосов
/ 01 октября 2010

Регулярные выражения - неправильный инструмент. Селекторы CSS - это сложный способ. Пример:

bo\
dy:not(.\}) {}

Используйте парсер с реальным токенизатором, подобным этому: PHP-CSS-Parser . Проще переписать его на Java, чем правильно сделать регулярное выражение.

1 голос
/ 31 декабря 2010

Это Regex, которое я использую в своих кодах:

[+>~, ]?\s*(\w*[#.]\w+|\w+|\*)+(:[\w\-]+\([\w\s\-\+]*\))*(\[[\w ]+=?[^\]]*\])*([#.]\w+)*(:[\w\-]+\([\w\s\-\+]*\))*

После токенизации я использую функцию обрезки для удаления лишних пробелов, например:

выражение:

EE.class      EE#id.class

токены:

EE.class

   EE#id.class

токены после трима:

EE.class

EE # id.class

ИЛИ, например,

> EE.class (Оповещение, когда это прямой дочерний элемент, затем я обрабатываю любой код подстроки)

Другие подпрограммы могут проверять, является ли токен числом, например,

Вы можете использовать http://regexpal.com/ для испытаний.

0 голосов
/ 01 октября 2010

Проблема с типичным регулярным выражением заключается в том, что они не могут обрабатывать произвольные уровни вложенности.У них нет памяти.Рассмотрим строку с некоторым числом a, за которой следует такое же количество b: aaabbb и разумное регулярное выражение a*b*.Когда регулярное выражение попадает в первое 'b', у него нет памяти, сколько а он распознало, и поэтому оно не может распознать такое же количество б.*, IF и END, <x> и </x> и т. Д. ... и вы можете увидеть проблему.

...