我有这段代码,它可以从网站中提取所有链接。如何编辑它以使其仅提取以 .mp3 结尾的链接?以下是以下代码:
preg_match_all("/\<a.+?href=(\"|')(?!javascript:|#)(.+?)(\"|')/i", $html, $matches);
我有这段代码,它可以从网站中提取所有链接。如何编辑它以使其仅提取以 .mp3 结尾的链接?以下是以下代码:
preg_match_all("/\<a.+?href=(\"|')(?!javascript:|#)(.+?)(\"|')/i", $html, $matches);
更新:
正如@zerkms 在评论中提到的那样,一个不错的解决方案是将DOM与XPath一起使用:
$doc = new DOMDocument();
$doc->loadHTML($yourHtml);
$xpath = new DOMXPath($doc);
// use the XPath function ends-with to select only those links which end with mp3
$links = $xpath->query('//a[ends-with(@href, ".mp3")]/@href');
原答案:
我会为此使用 DOM:
$doc = new DOMDocument();
$doc->loadHTML($yourHtml);
$links = array();
foreach($doc->getElementsByTagName('a') as $elem) {
if($elem->hasAttribute('href')
&& preg_match('/.*\.mp3$/i', $elem->getAttribute('href')) {
$links []= $elem->getAttribute('href');
}
}
var_dump($links);
我更喜欢 XPath,它旨在解析 XML/xHTML:
$DOM = new DOMDocument();
@$DOM->loadHTML($html); // use the @ to suppress warnings from invalid HTML
$XPath = new DOMXPath($DOM);
$links = array();
$link_nodes = $XPath->query('//a[contains(@href, ".mp3")]');
foreach($link_nodes as $link_node) {
$source = $link_nodes->getAttribute('href');
// do some extra work to make sure .mp3 is at the end of the string
$links[] = $source;
}
如果您使用的是 XPath 2.0,则可以替换一个ends-with()
XPath 函数。contains()
否则,您可能需要添加一个额外的条件以确保.mp3
在字符串的末尾。不过可能没有必要。