如何获得与mp3的链接作为扩展名

时间:2013-06-20 21:44:15

标签: php hyperlink extract preg-match-all

我有这段代码从网站中提取所有链接。如何编辑它以便它只提取以.mp3结尾的链接? 以下是以下代码:

preg_match_all("/\<a.+?href=(\"|')(?!javascript:|#)(.+?)(\"|')/i", $html, $matches); 

2 个答案:

答案 0 :(得分:3)

更新

一个很好的解决方案是将DOMXPath一起使用,如评论中提到的@zerkms:

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

答案 1 :(得分:1)

我更喜欢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位于字符串的末尾。虽然可能没有必要。