2011-07-14 55 views
0

屬性我有以下的正則表達式:返回從CSS的CSS值使用正則表達式

$string = 'font-size:12em;'; 

$pattern = '@:[A-Za-z0-9.]+;@i'; 

preg_match($pattern, $string, $matches); 

$matches回報:

Array ([0] => :12em;) 

但是,爲什麼是:;回來了?我怎樣才能得到它不返回這些冒號,只返回CSS值12em

回答

1

由於該數組中的第一個元素是整個匹配。使用捕獲組,並使用第二個元素(或使用lookarounds)。

例子:

preg_match('/:\s*(\w[^;}]*?)\s*[;}]/', $string, $matches); 
print $matches[1]; 

注意,這樣的事情不會在所有情況下工作。評論和更復雜的陳述可能會打破它。

例子:

/* foo: bar; */ 
foo: url("bar?q=:x;"); 
+0

這是一個很好的觀點,我真正需要的是以'em'和'px'結尾的CSS值 - 也許我應該用這些來縮小範圍?你將如何在你的正則表達式中實現這一點? – Abs

+0

@Abs,試試'/:\ s *(\ w [^;}] *?(?: em | px))\ s * [;}] /' – Qtax

0

使用這個模式來代替:

@(?<=:)[A-Za-z0-9.]+(?=;)@i 

的解釋是,你(?<=)(?=)分別回顧後和預讀組。這意味着他們不會被捕獲爲比賽的一部分。


編輯爲了處理%的+更多

@(?<=:)[^;][email protected] 
+0

行之有效。但是,當我在'width:10%'上嘗試它時,它似乎沒有返回任何值?也許'%'是一個特殊的字符? – Abs