Удаление / замена с помощью Perl Regex - PullRequest
0 голосов
/ 06 июня 2009

Так что я довольно новичок в программировании в целом, так что это может быть глупым вопросом, но я специально пытаюсь использовать регулярные выражения для удаления тега CSS. В основном у меня есть это:

.style1 {  
    font-size: 24px;  
    font-weight: bold;  
    color: #FFEFA1;  
} 

и я хочу, чтобы это выглядело так:

.style1:color:#FFEFA1

Я хочу сохранить имя стиля, цветовые атрибуты и шестнадцатеричный цвет с двоеточием и без пробелов. Я пытался сделать что-то вроде следующего:

$strip =~ s/\w+\}|\w+^#([0-9a-fA-F]{3})|([0-9a-fA-F]{6})//;

но это не работает. Кто-нибудь хочет поставить меня на правильный путь?

Приветствие.

Ответы [ 4 ]

4 голосов
/ 06 июня 2009

Это, как и большинство ответов на Perl, начинается с «Использовать CPAN». Все, что вы когда-либо хотели сделать, было сделано раньше.

use CSS;

my $css = CSS->new();

$css->read_string('
.style1 {
font-size: 24px;
font-weight: bold;
color: #FFEFA1;
} 
');

$color = $css->get_style_by_selector('.style1')
             ->get_property_by_name('color')
             ->values;

Использование таких модулей, как CSS из CPAN, означает, что кто-то уже рассмотрел крайние случаи, которых нет в ваших решениях regex. Рассмотрим:

.someClass, div.otherClass, #someid {
    color: #aa00aa
}

Получение цвета с использованием регулярных выражений для определенного селектора стало намного сложнее.

3 голосов
/ 06 июня 2009

Если вы знаете, что в $strip будет атрибут цвета, вы можете использовать

$strip =~ s!\s*{.*color:\s*(#[0-9a-f]{6});.*}!:color:$1!is;

Что следует отметить:

  • i модификатор делает поиск без учета регистра
  • s модификатор означает, что '.' символ соответствует любому символу , включая символы новой строки
0 голосов
/ 07 июня 2009

Не знаю, почему это не было упомянуто, но фигурная скобка имеет особое значение в регулярных выражениях, и поэтому ее необходимо экранировать.

0 голосов
/ 06 июня 2009

Я написал это в оболочке среды plan9port, но она легко переносится на любой linux.

Этот фрагмент кода создает скрипт sed для восстановления ваших данных.

#!/usr/local/plan9/bin/rc
# .style1:color:#FFEFA1
cat > this.sed <<EOF
# for lines which start with .
/\./{
# strip open curly brace
s, {,:,
# store element tag
h
# skip to next line
n
}

# strip close curly brace
/}/d

# for other lines
{
# remove spaces
s, ,,g
# get rid of ; at end
s,;$,,g
# pull back in the element tag
G
# join to one line
s,\n,,
# shift element tag to the start
# sed in plan 9 is a little different
# for gnu sed, use \( \) and \+
s,(.*)(\.[^.]+$),\2\1,
# finally print something
p
}
EOF

Этот фрагмент кода запускает ваш ввод для сценария sed,

cat | sed -n -f this.sed <<EOF
.style1 {
font-size: 24px;
font-weight: bold;
color: #FFEFA1;
}
EOF

для генерации этого вывода.

.style1:font-size:24px
.style1:font-weight:bold
.style1:color:#FFEFA1

Вы можете использовать grep для нужных вам строк или "grep -v" для тех, которые вам не нужны.

...