2013-06-20 1 views
0

У меня есть этот код, который извлекает все ссылки с веб-сайта. Как отредактировать его так, чтобы он извлекал только ссылки, заканчивающиеся на .mp3? Вот следующий код:Как получить ссылки с mp3 как расширение

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

Вы еще что-нибудь пробовали? – Pinoniq

+2

Используйте DOM и следующий xpath: '// a [end-with (@href," .mp3 ")]' - было бы намного проще, я полагаю :-) – zerkms

+1

@zerkms XPath, 'end-with' звучит много лучше, чем мой ответ! Не читал ваш комментарий до – hek2mgl

ответ

3

Update:

хорошее решение было бы использовать DOM вместе с XPath как @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

Я предпочел бы 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; 
} 

Существует ends-with() функция XPath, что вы можете заменить , если вы используете XPath 2.0. В противном случае вы можете добавить дополнительное условие, чтобы убедиться, что .mp3 находится в конце строки. Однако это может и не понадобиться.