PHP RegEx: удалить правила CSS, кроме случаев, когда они содержат определенную строку - PullRequest
0 голосов
/ 01 ноября 2018

Я изо всех сил пытаюсь сопоставить и сохранить все правила CSS, содержащие строку 224,13,78.

Пример ввода:

h1 {
    color: rgb(224,13,78);
}


h1 {
    display: block; /* Delete this whole block */
}


#test-color {
    color: rgb(224,13,78);
}    


.test-position {
    position: absolute; /* Delete this whole block */
}


.test-bg-color {
    background-color: rgba(224,13,78,0.5);
}


@media ( max-width: 1200px ) {
    .test-color {
        color: rgb(224,13,78);
    }

    .test-position {
        overflow: hidden; /* Delete this whole block */
    }
}

Желаемый вывод:

h1 {
    color: rgb(224,13,78);
}


#test-color {
    color: rgb(224,13,78);
}


.test-bg-color {
    background-color: rgba(224,13,78,0.5);
}


@media ( max-width: 1200px ) {
    .test-color {
        color: rgb(224,13,78);
    }
}

Есть ли удобное регулярное выражение, которое решает мою проблему?

Для справки, я нашел это решение, но оно соответствует имени свойства, а не значению:

Найти: \{.*(font-size\:\s*\d+px\;).*\}?

Заменить: \{ $1 \}

А также это решение JavaScript, которое делает то же самое:

Что такое RegEx для удаления css с сохранением размера шрифта

Я тоже принимаю решение JavaScript, но PHP предпочтительнее.

Спасибо всем заранее.

1 Ответ

0 голосов
/ 01 ноября 2018

Попробуйте следующее регулярное выражение:

\h*+[^\s{}][^{}]*{(?:[^{}](224,13,78)?)++[^{}]*+}(?(1)(*SKIP)(*F))\R*

Смотрите демо здесь

Он пытается сопоставить последовательность символов 224,13,78 в блоке {...}. Если он совпадает, он содержит значение в первой группе захвата. Затем позже мы говорим, если 1-я группа захвата была успешной в сопоставлении, тогда пропускаем все, что было найдено:

(?(1)(*SKIP)(*F))

в противном случае все совпадение не содержит желаемых символов, и движок не пропустит его. Теперь нам нужно только заменить совпадающие блоки ничем:

$css = preg_replace('~\h*+[^\s{}][^{}]*{(?:[^{}](224,13,78)?)++[^{}]*+}(?(1)(*SKIP)(*F))\R*~', '', $css);
...