2014-10-31 133 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