Регулярное выражение для определения классов / идентификаторов в файле CSS, которые не имеют содержимого - PullRequest
0 голосов
/ 16 марта 2010

Я нахожусь в процессе обновления некоторых старых файлов CSS в наших системах, и у нас есть куча, в которой много пустых классов, просто занимающих место в файле. Я хотел бы научиться писать регулярные выражения, но я просто не понимаю их. Я надеюсь, что чем больше я буду открываться им (с чуть более сплоченным объяснением), тем больше я пойму их.

Проблема

Тем не менее, я ищу выражение, которое идентифицирует текст, за которым следует '{' (некоторые имеют пробелы между, а некоторые нет), и если между этими скобками и '}' нет букв или цифр (пробелы не учитываются), он будет идентифицирован как соответствующая строка.

Полагаю, я могу удалить пробел из документа, прежде чем запускать через него регулярное выражение, но я не хочу менять основную структуру текста. Я надеюсь вернуть его в большое <textarea>.

Бонусные баллы за объяснение символов и их значений, а также выражение, идентифицирующее строки в копии без какого-либо текста или цифр. Я, скорее всего, буду использовать последнее выражение в скрипте PHP.

TL; др:

Регулярное выражение для соответствия:

.a_class_or #an_id {
    /* if there aren't any alphanumerics in here, 
       this should be a matching line of text */
}

Ответы [ 3 ]

1 голос
/ 16 марта 2010

Вот хорошее начало на одном. Проверено на PHP.

/[#\w\s\.\-\[\]\=\^\~\:]+\{[\s\n\r\t]*\}/

Теперь разбиваем его на части;

Эта часть соответствует селектору. # для идентификаторов, \ w соответствует буквенно-цифровым символам и подчеркиваниям, точка для классов. Затем я добавил [] = ^ и ~ для некоторых расширенных селекторов CSS, но я был бы удивлен, если бы они использовались очень часто.

[#\w\s\.\-\[\]\=\^\~\:]+

Вторая часть ищет пустое пространство внутри фигурных скобок. У нас есть специальные символы для пробелов, новых строк, возвратов и вкладок. Если есть что-то еще, это не будет соответствовать.

\{[\s\n\r\t]*\}

А вот код, который я использовал для проверки его на PHP, если вам интересно.

<?php
$myString = <<<HERE
#myDiv a.awesome[href=google.com]{

}
HERE;
$regex = "/[#\w\s\.\-\[\]\=\^\~\:]+\{[\s\n\r\t]*\}/";
echo preg_replace($regex, "replaced!", $myString);
1 голос
/ 16 марта 2010

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

Скачать CSS Tidy для PHP - я сам сделал это за 5 минут и протестировал. Прекрасно работает.

require( 'csstidy/class.csstidy.php' );

$tidy = new csstidy();

$tidy->parse( "
.test {
  font-weight: bold;
}

.empty {
}

.test2 {
  font-style: italic;
}" );

echo '<pre>';
echo $tidy->print->plain();

Вот вывод

.test {
font-weight:700;
}

.test2 {
font-style:italic;
}
1 голос
/ 16 марта 2010

Это будет соответствовать нулю или большему количеству пробелов между {и}

\{\s*\}

Вы должны избегать обоих {и}, так как они являются специальными символами в RegEx.

\ s - означает любой символ пробела, включая символ табуляции, новую строку и т. Д. *

\ s * - любое количество пробелов

...