Соответствует селектору CSS, который не начинается с селектора
Если у меня есть файл CSS, например, так:
div {
color: red;
}
a{color: red}.someClass {color: red}
.someOtherClass {
color: red;
}
@media (max-width: 767px){
div { color: green; }
[data-module="123"] .someOtherClass { color: green; }
}
[data-module='123'] .someRandomClass { color: red }
[data-module='123'] .someOtherRandomClass {
color: red;
}
Только эти последние три соответствуют правильному использованию CSS в нашей компании:
[data-module='123'] .someOtherClass {
[data-module="123"] .someRandomClass {
[data-module='123'] .someOtherRandomClass {
Поскольку они начинаются с [data-module='xxx'] (обратите внимание, что пользователи могут использовать "или"), я смог найти / отредактировать REGEX, который правильно соответствует этим трем последним, но мне нужно обратное, я хочу соответствовать селекторы, которые не начинаются с [data-module="xxx"]... Поэтому, когда я проверяю с помощью PHP/Regex, если он совпадает, мне придется сообщить пользователю, что он не следует правилам... regex должен учитывать, что этот CSS может быть неорганизованным, как в примере, а также могут быть медиа-запросы.
Может ли какой-нибудь волшебный человек помочь мне понять это? Потому что это волшебство... какой-то источник... не могу понять
РЕДАКТИРОВАТЬ: я хочу что-то вроде этого Regex: http://regexr.com/328s7
Но совпадают, только если у селектора нет [data-module = "xxx"] перед ним
1 ответ
Заметки
Дополнительная информация (в комментариях под вопросом) позволила мне правильно создать регулярное выражение, которое будет работать в вашей ситуации.
Обратите внимание, что этот ответ можно улучшить, следуя истинным правилам селектора CSS, а также правилам объявления / списка объявлений / блоков объявлений, однако, учитывая важность синтаксиса CSS-селектора в этом вопросе, я решил игнорировать его и принять все символы (кроме новой строки и фигурных скобок). Это регулярное выражение не будет работать в любых строках, где перед селекторами стоит фигурная скобка (поэтому убедитесь, что вы предварительно украсили свой CSS с помощью какого-либо инструмента автоформатирования, если вы склонны писать неаккуратный код).
Обратите внимание, что приведенное ниже регулярное выражение требует двух следующих модификаторов:
- Глобальный:
g
- Мульти линия:
m
Ответ
Regex
^([\r\n]*)((?!\[data-module=(['"])\d+\3\])[^\r\n{}])+({[\s\S]*?})$
Чтобы объяснить немного того, что делает это регулярное выражение:
- Утвердить позицию в начале строки
- Совпадение от нуля до неограниченного времени возврата каретки
\r
или перевод строки\n
персонажи - Совпадение между одним и неограниченным количеством раз, но как можно меньшим количеством символов, которые не появляются в группе (
\r\n{}
) и это не содержит структуру[data-module=
сопровождаемый или единственной цитатой'
или двойная кавычка"
символ, за которым следуют от одной до неограниченных цифр, за которым следует тот же ранее сопоставленный символ (одинарная или двойная кавычка - обеспечивает правильное закрытие) и, наконец, закрывающая квадратная скобка]
- Сопоставьте блок объявления CSS, проверив наличие открывающей фигурной скобки
{
за которым следует любой символ (включая символы новой строки) от нуля до неограниченного количества раз, но как можно меньше раз, за которым следует закрывающая фигурная скобка}
- Утвердить позицию в конце строки (здесь не очень нужно, но мне нравится соответствие с первым шагом)
Обновить
Regex
^([\r\n]*)(@.*?{[\r\n]*)?((?!\[data-module=(['"])\d+\4\])[^@\r\n{}])+({[\s\S]*?})([\r\n]*})?$
Этот также поймает в правилах. Обратите внимание, что он не будет перехватывать начальное правило at, однако.
Например, если у вас есть следующий код:
@media (max-width: 767px){
[data-module="123"] .someOtherClass { color: green; }
.someOtherClass { color: green; }
[data-module="123"] .someOtherClass { color: green; }
.someOtherClass { color: green; }
}
В приведенном выше примере, только третья, пятая и шестая строки будут пойманы. Первая строка @media ...
не будут захвачены.