2009-06-05 56 views
0

所以我對編程一般都很陌生,所以這可能是一個愚蠢的問題,但我特別試圖用正則表達式去掉CSS標籤。基本上,我有這樣的:剝離/用Perl替換正則表達式

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

但它不工作。任何人都在意讓我走上正確的道路?

乾杯。

+0

我注意到第一個大括號是},不應該是{? 另外,它怎麼不工作?哪些部件匹配,哪些部件不匹配? – whatsisname 2009-06-05 21:59:50

+0

你說得對。我改變了支架,它仍然不起作用。 我想也許我可能需要別的東西...... 也許就像「如果這行有一個十六進制代碼或括號上,然後不刪除它,但刪除一切,但我不是確定如何對代碼進行編碼 – goddamnyouryan 2009-06-05 22:21:29

+0

請注意,這正是使用正則表達式給其他程序員帶來的問題的類型。解析是要走的路,CPAN已經有'CSS'(死簡單的API)或'CSS :: SAC'。 – hao 2009-06-05 22:55:54

回答

3

如果你知道會有內$strip顏色屬性,你可以使用

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

注意事項:

  • i修改確實不區分大小寫匹配
  • s修改意味着, ''字符匹配任何字符包括換行符
+0

即使您不知道是否會有顏色屬性,是否可以包裝顏色正則表達式在一個「(顏色:\ s *(#[0-9a-f] {6});。*})?」然後在做一些檢查之後呢? – 2009-06-05 22:36:17

+0

感謝Benny-不確定Ryan想在ca 「顏色」不存在。瑞恩? – Beano 2009-06-06 09:09:17

0

我在plan9port環境shell寫到這,但它的端口容易任何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」那些你不需要的行。

4

這和大多數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; 

從CPAN使用CSS等模塊意味着有人已經考慮過你的正則表達式解決方案沒有的邊界情況。考慮:

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

使用正則表達式爲特定選擇器獲取顏色只是得到了很多困難。

0

不知道爲什麼沒有提到,但大括號在正則表達式中有特殊含義,因此需要轉義。