2014-10-31 230 views
0

我想從亞馬遜獲得一些數據,我正在使用preg_match來查找我需要的元素。但是,我遇到了問題。正則表達式「|」問題

我將兩條語句組合在一起,所以如果找不到其中一條,我相信,除非產品沒有列入其中,否則這些事情將永遠存在。

那麼它在做什麼是尋找運輸成本。如果沒有找到「免運費」文本。

preg_match_all('/(& <b>(.*?)<|<span class="olpShippingPrice">(.*?)<)/',$results,$match1); 

如果我運行此我得到我想要的數據,但它抓住了一些HTML,如果我跑這兩個不同的preg_matches這不會是抓住。我無法弄清楚如何展示它,但是它在第一個'免費送貨'和下面的所有文字都是粗體的,抓住了大膽的標籤。你也可以看到胡蘿蔔。

[1]=> 
    array(10) { 
    [0]=> 
    string(38) "$30.00<" 
    [1]=> 
    string(37) "$6.99<" 
    [2]=> 
    string(37) "$6.99<" 
    [3]=> 
    string(38) "$53.99<" 
    [4]=> 
    string(37) "$5.25<" 
    [5]=> 
    string(19) "& FREE Shipping<" 
    [6]=> 
    string(19) "& FREE Shipping<" 
    [7]=> 
    string(19) "& FREE Shipping<" 
    [8]=> 
    string(19) "& FREE Shipping<" 
    [9]=> 
    string(38) "$70.39<" 
    } 

所以我的問題:我應該做些什麼來刪除這個,所以我留下了乾淨的數據標籤和胡蘿蔔?此外,在兩個獨立的preg_match中運行這些對我來說不起作用。

+0

從匹配中刪除'<' – 2014-10-31 15:05:11

+0

這是如何重複的?對我來說似乎很獨特。 – 2014-10-31 15:06:43

+0

@ smack-a-bro因爲用正則表達式解析HTML是不好的,所鏈接問題的答案是值得注意的警告。 ***特別是當你不控制源HTML時。 – 2014-10-31 15:08:03

回答

1

沒有看到您的示例文本,很難確切地知道您需要什麼。但你需要做的主要事情是將那些「不想要的」字符帶出捕獲組;然後使用捕獲組作爲您的乾淨數據:

preg_match_all('/(?:& <b>|<span class="olpShippingPrice">)(.*?)</',$results,$match1); 
+0

就是這樣。萬分感謝。由於閱讀我應該用RegEx解析HTML,那麼應該使用什麼? – 2014-10-31 15:13:42

+0

@ smack-a-bro http://php.net/domdocument是我的首選方法。 – 2014-10-31 15:18:25