2009-06-05 6 views
0

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

.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})//; 

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

Cheers.

+0

Я заметил, что первая фигурная скобка есть}, не должно ли это быть {? также, как это не работает? Какие детали соответствуют, а какие нет? – whatsisname

+0

Ты прав.Я сменил кронштейн, и он все еще не работает. Я думаю, возможно, что мне может понадобиться что-то еще ... возможно, как «если у этой строки есть шестнадцатеричный код или скобка на нем, то не удаляйте его, а удаляйте все остальное. конечно, как закодировать это. – goddamnyouryan

+0

Обратите внимание, что это именно тот тип проблемы, при котором использование регулярных выражений дает другим приключениям программистов. Parsing - это путь, и CPAN уже имеет 'CSS' (dead-simple API) или' CSS :: SAC'. – hao

ответ

3

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

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

Things отметить:

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

Даже если вы не знаете, будет ли атрибут цвета, вы не можете обернуть регулярное выражение цвета в "(цвет: \ s * (# [0-9a-f] {6});. *})?", а затем выполните некоторую проверку после этого? –

+0

Спасибо Бенни - не знаете, какое поведение хочет Райан в ca «цвет» не присутствует. Райан? – Beano

0

Я написал это в оболочке 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 

Этот бит кода выполняется ввод против СЕПГ сценария,

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», которые у вас нет.

4

Это, как и большинство ответов perl, начинается с «Use 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, означает, что кто-то уже рассмотрел случаи кросс, которые не имеют ваши решения в регулярном выражении. Рассмотрим:

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

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

0

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

Смежные вопросы