Я пытаюсь написать регулярное выражение, которое соответствует правильной структуре имени класса CSS. У меня это до сих пор:
$pattern = "([A-Za-z]*\.[A-Za-z]+\s*{)"; $regex = preg_match_all($pattern, $html, $matches);
Однако имя класса может быть в следующих форматах, которые не будет соответствовать моему регулярному выражению:
p.my_class{ } p.thisclas45{ }
Это всего лишь некоторые случаи, я осмотрелся, чтобы найти правила того, как вы можете назвать класс в блоке стиля, но ничего не мог найти. Кто-нибудь знает, где правила для соглашений об именах классов?
Есть ли еще случаи, которые мне нужно рассмотреть? Какое регулярное выражение вы бы использовали для сопоставления имени класса?
Я уже сузил его до блока стиля, используя класс PHP DOM Document.
Посмотрите http://www.w3.org/TR/CSS21/grammar.html#scanner
Согласно этой грамматике и сообщению Какие символы действительны в именах / селекторах классов CSS? это должен быть правильный шаблон для сканирования классов css:
\.-?[_a-zA-Z]+[_a-zA-Z0-9-]*\s*\{
Примечание. Названия тегов не требуются в качестве префикса для классов в css. Просто .hello { border: 1; }
.hello { border: 1; }
также действительна.
Это регулярное выражение:
/(\w+)?(\s*>\s*)?(#\w+)?\s*(\.\w+)?\s*{/gm
будет соответствовать любому из следующего:
p.my_class{} p.thisclas45{} .simple_class{} tag#id.class{} tag > #id{}
Здесь вы можете поиграть с ним в RegExr.