$ 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;
}
答案 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>
。由此,捕获的组将如下:
以下是可以使用的REGEX:
https://regex101.com/r/yX7qZ5/1
这是一个使用PHP脚本中的表达式的工作演示: