2011-12-22 26 views
0

我需要用preg_match_all來表示PHP中的字符串,以查找零件並填充數據庫。我已經大部分制定了,但只是一部分,即時通訊掛了上找到測量部分:在字符串中解析出測量結果(長x寬x高)

這裏是我的字符串:

「NA153 - 火盆捏造從一個老式丙烷罐,會爲水景或玻璃上工作,可以添加一個不尋常咖啡桌以及,23H X 39W - $ 1200.00"

這是到目前爲止,我REG例如:

"%([A-Z0-9]{5}) #Find Sku 
\s*\-?\s* 
(.*)\s*\, # Find Title 
\s* 
.*([0-9][HWD])\s*\-? #Find Dimensions 
\s* 
\$([0-9\.]*) # Find Price 
%x" 

它正確地找到sku,標題和價格。但維它返回只有1「9W」

這裏是我的函數調用:

preg_match_all('{{regular expression}}', '{{string}}', $arr, PREG_PATTERN_ORDER); 

任何幫助或洞察力將是我新的正則表達式將不勝感激。

回答

1

只是拋出一個+量詞的[0-9]組後的尺寸,像這樣:

"%([A-Z0-9]{5}) #Find Sku 
\s*\-?\s* 
(.*)\s*\, # Find Title 
\s* 
.*([0-9]+[HWD])\s*\-? #Find Dimensions 
\s* 
\$([0-9\.]*) # Find Price 
%x" 

+量詞將導致它貪婪地尋找儘可能多的數字,因爲它可以持續到[HWD]之前。

編輯:對不起,這隻會讓你`39W'。爲了讓搶多個維度,您需要進一步改變:

'/([A-Z0-9]{5}) #Find Sku 
\s*\-?\s* 
(.*)\s*\, # Find Title 
\s* 
.*?([0-9]+[HWD](?:\s+x\s+[0-9]+[HWD])*)\s*\-? #Find Dimensions 
\s* 
\$([0-9\.]*) # Find Price 
%/' 
+1

+1幾乎沒有。注意我對貪婪,單引號和括號做了一些編輯。 – 2011-12-22 20:16:16

+0

'。*'後面的'?'是一個很好的編輯,我沒有注意到,直到我把它扔進一個測試器。但是,我將括號放回原來的樣子 - 我的假設(可能是錯誤的!)是,OP想要一個捕獲組中的所有維度。 (例如,'23H x 39W'將被捕獲在一個組中) – ean5533 2011-12-22 20:21:47

+0

嗯,一個捕獲組是我所希望的,但我會採取任何東西 – justinhilles 2011-12-22 20:24:24

0

如果尺寸可以是小數,你可以使用:

(\d+(?:\.\d+)+[HWD](?:\s+x\s+\d+(?:\.\d+)+[HWD])*)\s*-? #Find Dimensions