我有一个名为$code的字符串。它包含如图所示的数据集。我正在尝试解析href=、channel=、src=的值。我试着使用赛前所有的比赛,但我没有得到任何数据!有人能告诉我解析上述数据的最佳方式是什么吗?提前谢谢。
$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;
}
我看到有几个人在评论中发布了使用DOM方法的消息,这很酷。不幸的是,我自己仍在学习如何使用DOM,所以我真的无法澄清您对此的问题。但我可以向您展示如何使用preg_match_all
来解析数据,就像您在示例中尝试的那样。
我想出的REGEX是这样的:
's*<div class="new">.*?href="((?:.*?)channel=(.*?))".*?src="(.*?)".*?</a>'s*</div>
它的作用如下:
's*
-查找空白空间's
,该空白空间可能出现任意次数的*
<div class="new">
-找到准确的div.*?
-我在整个表达式中使用了几次,它只是指抓取任何字符.
,任何次数的*
,直到它与表达式?
的下一部分匹配href="
-这是表达式的下一部分。我们实际上是在匹配字符串href="
((?:.*?)
-我们要做的第一件事是打开括号(
,它将捕获我们的完整URL。紧接着,我们启动另一个组,该组将匹配"通道".*?
之前的任何内容。我在这个组的前面添加了一个?:
,告诉正则表达式引擎不要记住这个组中的内容。(我们会记住整个url……不需要这一部分。)channel=
-从字面上匹配字符串channel=
(.*?))"
-我们将匹配短语channel=
之后的任何内容,直到它达到引号"
。我们把它放在括号里是因为我们想捕获这里的内容以便以后使用。我们还关闭了几步前打开的括号,以获取完整的url.*?src="
-通过src="
查找任何内容,然后按字面意思匹配该短语(.*?)"
-捕获src="
后面的值,直到结束引号"
.*?
-通过下一个标签匹配之后的任何内容</a>'s*</div>
-匹配一个可以后跟空白字符's*
的结束"a"标记</a>
和一个结束"div"标记</div>
由此,捕获的组将如下:
- href
- 通道
- src
以下是可以玩的REGEX:
https://regex101.com/r/yX7qZ5/1
下面是一个使用PHP脚本中的表达式的工作演示:
http://ideone.com/YabeHW