正则表达式解析亚马逊代码段HTML标签

时间:2016-05-16 16:36:12

标签: php regex

我得到了这两个片段:

<a rel="nofollow" href="http://www.amazon.de/gp/product/B004DI7A5S/ref=as_li_tl?ie=UTF8&camp=1638&creative=6742&creativeASIN=B004DI7A5S&linkCode=as2&tag=webbigode-21">PFIFF Reitstrumpf kariert, grau/lila, 37-39, 100322-144-37</a><img src="http://ir-de.amazon-adsystem.com/e/ir?t=webbigode-21&l=as2&o=3&a=B004DI7A5S" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

第二个:

<a rel="nofollow" href="http://www.amazon.de/gp/product/B004DI7A5S/ref=as_li_tl?ie=UTF8&camp=1638&creative=6742&creativeASIN=B004DI7A5S&linkCode=as2&tag=webbigode-21"><img border="0" src="http://ws-eu.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B004DI7A5S&Format=_SL110_&ID=AsinImage&MarketPlace=DE&ServiceVersion=20070822&WS=1&tag=webbigode-21" ></a><img src="http://ir-de.amazon-adsystem.com/e/ir?t=webbigode-21&l=as2&o=3&a=B004DI7A5S" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

(请注意,它们相似,但第二个稍长。)

从第一个片段我需要href的内容,从第二个我需要图片来源的内容。

这不起作用:

$result = preg_match_all("/<img.*?src\s*=.*?>/",$_POST['bild'],$matches);  

我该怎么办?

3 个答案:

答案 0 :(得分:1)

您可以使用Simple HTML DOM来解析HTML。

,而不是使用RegEx
include 'simple_html_dom.php';

$html = str_get_html('<a rel="nofollow" href="http://www.amazon.de/gp/product/B004DI7A5S/ref=as_li_tl?ie=UTF8&camp=1638&creative=6742&creativeASIN=B004DI7A5S&linkCode=as2&tag=webbigode-21"><img border="0" src="http://ws-eu.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B004DI7A5S&Format=_SL110_&ID=AsinImage&MarketPlace=DE&ServiceVersion=20070822&WS=1&tag=webbigode-21" ></a><img src="http://ir-de.amazon-adsystem.com/e/ir?t=webbigode-21&l=as2&o=3&a=B004DI7A5S" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />');
echo $html->find('a', 0)->href . PHP_EOL;
echo $html->find('img', 0)->src;

答案 1 :(得分:0)

这个提取href(~36步):

<a(?:\s*(?!href)[^\s>]*)*\s*href=["']([^"']+)

这个提取src(~59步):

<img(?:\s*(?!src)[^\s>]*)*\s*src=["']([^"']+)

标签是常规的,可以很容易地通过正则表达式进行解析。请注意,我假设属性(href和src)被各种各样的引号包围。

这些正则表达式相当快(它们比其他正则表达式的答案速度超过10倍)。它们可能比完整解析器更快,实际上是在PCRE中进行了所有优化。

基本上,我的正则表达式几乎相同。他们找到了标记<a的开头,并查看其后是否有任何属性。如果属性不是您想要的属性,则会跳过(?:\s*(?!href)[^\s>]*)*。您想要的那个被捕获\s*href=["']([^"']+)["']

答案 2 :(得分:0)

您可以使用非常简单的正则表达式解析这些值,使用非贪婪“点”(.*?)的概念虽然点将匹配任何内容,但它只会消耗一个char一次,然后让其余的模式(双引号分隔符)匹配。您可以添加一些命名组以实现可读性和结果访问:

href="(?<href>.*?)"|src="(?<imgsrc>.*?)" //global
  • 正如劳雷尔所指出的那样,复杂性的降低是以执行速度为代价的。权衡取决于您的使用案例。

regex demo