2009-06-04 172 views
2

嘿所有我有一個大HTML字符串像正則表達式的幫助,貪婪與非貪婪

<a style="background: rgb(100, 101, 43) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-backg round-inline-policy: -moz-initial;" href="#">swatch4</a> 
<a style="background: rgb(34, 68, 33) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-b ackground-inline-policy: -moz-initial;" href="#">swatch5</a> 
<a style="background: rgb(11, 38, 68) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -m oz-background-inline-policy: -moz-initial;" href="#">swatch6</a> 
<a style="background: rgb(39, 11, 60) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial ; -moz-background-inline-policy: -moz-initial;" href="#">swatch7</a> 

...有很多這些條目...

我想什麼來結束得到的是一個PHP陣列

$colors = array(
'rgb(34, 34, 33)', 
'rgb(11, 38, 68)', 
... 
); 

步驟我需要提取字符串的一部分RGB幫助。我的正則表達式吃了太多的字符串時遇到了麻煩。 Anyhelp將不勝感激,我想把它弄清楚並學會如何去做(而不是僅僅完成它)。我使用vim btw。

由於

回答

6

的簡單正則表達式是

(rgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\)) 

每個 「\ S * \ d {1,3} \ S *」,是指:

  • 匹配空間(空間像''或製表符,如molf在評論中所述,從0到inf的數字)
  • 匹配一個數字(從1到3位,因爲你從0到255)
  • 匹配其他空間
  • 匹配一個逗號(,)

您可以使用保羅的代號爲陣列的一部分。

+4

我將代替空間與\ S *,首先澄清意圖(匹配任何空格),其次是因爲它也將允許製表符。 – molf 2009-06-04 21:14:23

0
preg_match_all('/rgb\(\d{1,3}, \d{1,3}, \d{1,3}\)/', $string, $matches); 
print_r($matches); 

如果你不能確定的間距,使用方法:

preg_match_all('/rgb\(\d{1,3},\s?\d{1,3},\s?\d{1,3}\)/', $string, $matches); 
print_r($matches);