【发布时间】:2011-09-21 15:34:01
【问题描述】:
我需要捕获给定 html 中的所有链接。
这里是示例代码:
<div class="infobar">
... some code goes here ...
<a href="/link/some-text">link 1</a>
<a href="/link/another-text">link 2</a>
<a href="/link/blabla">link 3</a>
<a href="/link/whassup">link 4</a>
... some code goes here ...
</div>
我需要获取div.infobar 中以/link/ 开头的所有链接
我试过了:
preg_match_all('#<div class="infobar">.*?(href="/link/(.*?)") .*?</div>#is', $raw, $x);
但它给了我唯一的第一场比赛。
感谢您的建议。
【问题讨论】:
-
也许有一个 html 解析器可以更轻松地为您做到这一点?
-
我已经得到了它,首先使用 preg_match 获取 div.infobar 的内部,然后使用 preg_match_all 获取链接。但是由于正则表达式提供了更大的灵活性,为什么我不应该使用它呢?我只需要一个好的模式。我想知道如何只用 1 个 preg_match_all 来完成它
-
你不能用一个正则表达式来做到这一点。您首先需要隔离 div,然后从中提取所需的链接。 -- 粗短的 cmets 是关于什么的:您可以使用 phpQuery 或 QueryPath 更轻松地提取链接,使用
foreach (qp($html)->find("div.infobar a") as $a) { print $a->attr("href"); } -
HTML 不是常规语言,所以是unwise to use a regular expression to parse HTML。
-
@stereofrog,公平点;对于这种特定情况,我无法改进anubhava's answer,我认为有点轻率是一种很好的方式来表明尝试使用错误的工具来完成这项工作会导致令人难以置信的挫败感。
标签: php regex preg-match-all