【问题标题】:How to parse href= and <img src= values inside <a class="block"...?如何解析 <a class="block"... 中的 href= 和 <img src= 值?
【发布时间】:2016-04-15 04:33:53
【问题描述】:

我有一个名为 $code 的字符串。它包含如图所示的数据集。我正在尝试解析 href=,channel=,src= 的值。我尝试使用 preg match all 但我没有数据!谁能告诉我解析上述数据的最佳方法是什么?提前谢谢。

$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;

}

【问题讨论】:

  • 你需要用到DOMDocument和DOMXPath,搜索一下教程。你可以看这里:phptutorial.info/?domxpath.query
  • 感谢您的回复。 Casimir et Hippolyte 我编辑了我的第一篇文章我使用了 DOM 我得到了 href 的值但是如何获得 src = 的值?
  • 在您的代码中,您将获得每个具有类“块”属性的“a”节点。以同样的方式,您可以构建一个从每个节点搜索的其他查询 (在 foreach 循环内)(请参阅 PHP 手册中的 DOMXPath::query (第二个参数) ) 一个后代 img 节点并获取 src 属性。
  • 这样的:eval.in/500214

标签: php parsing dom preg-match-all


【解决方案1】:

我看到有几个人在 cmets 上发帖使用 DOM 方法,这很酷。不幸的是,我自己还在学习如何使用 DOM,所以我无法真正解决您的问题。但我可以向您展示如何使用 preg_match_all 来解析您的数据,就像您在示例中所做的那样。

我想出的正则表达式是这样的:

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

它的作用如下:

  • \s* - 寻找一个空格 \s,它可能出现多次 *
  • &lt;div class="new"&gt; - 找到准确的 div。
  • .*? - 我在整个表达式中使用了几次,它只是意味着抓取任何字符 .,任意次数 *,直到它匹配我们表达式的下一部分 ?
  • href=" - 这是表达式的下一部分。我们实际上是匹配字符串href="
  • ((?:.*?) - 我们要做的第一件事是打开括号 (,它将捕获我们的完整 URL。紧接着,我们开始另一个组,它将匹配任何内容,直到“频道”.*?。我在这个组的前面添加了?:,告诉正则表达式引擎不要记住这个组中的任何内容。 (我们将记住整个 url ...并且不需要这部分。)
  • channel= - 从字面上匹配字符串 channel=
  • (.*?))" - 我们将匹配短语 channel= 之后的任何内容,直到它遇到引号 "。我们把它放在括号中是因为我们想捕获这里的任何东西以供以后使用。我们还关闭了括号,该括号将在几步前打开以捕获完整的网址。
  • .*?src=" - 通过src=" 查找任何内容,然后逐字匹配该短语。
  • (.*?)" - 通过右引号 " 捕获 src=" 之后的任何值。
  • .*? - 通过下一个标签匹配之后的任何内容。
  • &lt;/a&gt;\s*&lt;/div&gt; - 匹配结束“a”标签&lt;/a&gt;,后面可以跟空格字符\s*,然后是结束“div”标签&lt;/div&gt;

由此,捕获的组如下:

  1. href
  2. 频道
  3. 源代码

这是一个可以玩的正则表达式:

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

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

http://ideone.com/YabeHW

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多