2013-06-20 13 views
-2

Я всегда использовал preg_match для очистки URL-адресов из файлов HTML, но мне хотелось извлечь только URL-адреса с .mp3 в качестве расширения. Мне сказали попробовать DOM, и я пытался исправить код, но он не работает. Я получаю пустую страницу, что бы я ни делал.Скрестить ссылки из HTML

Что я делаю неправильно?

<?php 
    $url = 'http://www.mp3olimp.net/miley-cyrus-when-i-look-at-you/'; 
    $html = @file_get_html($url); 
    $dom = new DOMDocument(); 
    $doc->loadHTML($html); 
    $xpath = new DOMXPath($doc); 
    $links = $xpath->query('//a[ends-with(@href, ".mp3")]/@href'); 

    echo $links; 
?> 
+0

Что происходит с print_r ($ links) вместо echo? –

+0

@MalcolmDiggs результат тот же, пустая страница – andrew

+1

Ну, первое, что я сделал бы, это удалить знак @ из @file_get_html. Превращение @ просто подавляет ошибки, но в этом случае вы ХОТИТЕ видеть ошибки, поэтому вы можете удалить его и позволить сценарию рассказать вам, что происходит не так. –

ответ

4

Есть пара проблем!

  • Как указано выше, удалите @ перед file_get_html(), чтобы увидеть ошибки.
  • file_get_contents($url) будет работать, чтобы получить содержимое HTML.
  • опечатка, $dom = должен быть $doc =
  • Другим раздражающим момента, источник HTML довольно уродлива, что приводит к более поздним ошибкам.
  • ends-with() поддерживается только в XPath 2.0, PHP использует XPath 1.0. Поэтому вам нужно будет найти другой способ проверить окончание. Немного регулярного выражения должно сделать трюк.
+0

Обязательно используйте правильное форматирование кода, чтобы упростить чтение ответа. – TimWolla

+1

Спасибо за это! Просто попав в эту вещь StackOverflow. Долгое время читатель, первый плакат (клише, я знаю). –

+0

Добро пожаловать. Обязательно прочитайте [help] (http://stackoverflow.com/help) и просмотрите параметры, которые предлагает редактор. Таким образом, должно быть легко написать хорошие ответы и получить репутацию. – TimWolla

0
$input = file_get_contents($url);  
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?.mp3)\\1[^>]*>(.*)<\/a>"; 
if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) { 
    foreach($matches as $match) { 
    // $match[2] = link address 
    // $match[3] = link text 
    } 
}