如何解析href =和<img src="values" inside="" <a="" class="block" ...?=""

时间:2016-01-10 23:07:54

标签: php parsing dom preg-match-all

="" 我有一个名为$ code.It的字符串,它包含如图所示的数据集。我试图解析href =,channel =,src =的值。我尝试使用preg匹配,但我没有数据!任何人都可以告诉我解析上述数据的最佳方法是什么?提前谢谢。

$ code的值:

        <div class="new"> <a class="block" target="_blank" href="http://somesite:8080/hls/mango1.m3u8?token=34523sedfsdfsdf&e=123456789&channel=mango1" data-toggle="modal" data-target="#mango1">
<div class="image-container"> <img src="images/mango1.png" class="img-responsive" > </div>
</a> </div>

        <div class="new"> <a class="block" target="_blank" href="http://somesite:8080/hls/mango2.m3u8?token=sfaesfraesgh452342&e=987654321&channel=mango2" data-toggle="modal" data-target="#mango2">
<div class="image-container"> <img src="images/mango2.png" class="img-responsive" > </div>
</a> </div>

php代码:

preg_match_all("#target=\"_blank\" href=\"([^<]+)\" data-toggl", $code, $foo2);

var_dump($foo2[1]); 
print_r($foo2[1]);

修改     我尝试使用DOM我得到了href的值,但是如何得到src =?

的值
$dom = new DOMDocument;
$dom->loadHTML($code);
$xpath = new DOMXPath($dom);

$nodeList = $xpath->query('//a[@class="block"]');
foreach ($nodeList as $node) {
    $href = $node->getAttribute('href');
    $imageurl = $node->getAttribute('src');

    echo "<br>".$href;
    echo "<br>".$imageurl;

}

1 个答案:

答案 0 :(得分:0)

我看到有几个人在评论中发布了使用DOM方法,这很酷。不幸的是,我仍在学习如何自己使用DOM,所以我真的无法解决你的问题。但我可以向您展示如何使用preg_match_all解析您的数据,就像您在示例中尝试的那样。

我提出的REGEX是:

\s*<div class="new">.*?href="((?:.*?)channel=(.*?))".*?src="(.*?)".*?</a>\s*</div>

以下是它的作用:

  • \s* - 正在寻找空格\s,可能会出现任意次*
  • <div class="new"> - 找到确切的div。
  • .*? - 我在整个表达式中使用了几次,它只是意味着抓取任何字符.,任意次*,直到它匹配我们表达式的下一部分?
  • href=" - 这是表达式的下一部分。我们字面上匹配字符串href="
  • ((?:.*?) - 我们要做的第一件事是打开将捕获完整网址的括号(。紧接着,我们启动另一个将匹配任何内容的小组,直到“频道”.*?。我在?:的前面添加了这个组的前面,告诉正则表达式引擎不要记住这个组中的任何内容。 (我们将记住整个网址......并且不需要这一部分。)
  • channel= - 按字面意思匹配字符串channel=
  • (.*?))" - 我们将匹配短语channel=之后的所有内容,直至达到引号"。我们把它放在括号中,因为我们想捕获这里的所有内容以便稍后使用。我们还关闭了我们的括号,它将在几个步骤之前打开以捕获完整的URL。
  • .*?src=" - 通过src="查找任何内容,然后字面上与该短语匹配。
  • (.*?)" - 通过结束引号src="捕获"后的任何内容的值。
  • .*? - 在此之后通过下一个标记匹配任何内容。
  • </a>\s*</div> - 匹配结束的“a”标记</a>,后跟空白字符\s*,后跟关闭的“div”标记</div>

由此,捕获的组将如下:

  1. HREF
  2. 信道
  3. SRC
  4. 以下是可以使用的REGEX:

    https://regex101.com/r/yX7qZ5/1

    这是一个使用PHP脚本中的表达式的工作演示:

    http://ideone.com/YabeHW