2014-07-31 3 views
0

Я делаю скрипт для получения всех ссылок с веб-сайта, но хочу получить только ссылки с определенным словом. У меня есть следующий сценарий, и теперь я могу получить все ссылки, и я не знаю, как создать regx для поиска слова я хочу:Получить все ссылки, содержащие слово

$url = file_get_contents("http://www.example.es"); 
preg_match_all("/<a(?:[^>]*)href=\"([^\"]*)\"(?:[^>]*)>(?:[^<]*)<\/a>/is", $url, $todosenlaces); 
+1

это невозможно сделать правильно с регулярным выражением - http://stackoverflow.com/questions/4702987/php-string-manipulation-extract-hrefs – birdspider

+0

Где это слово должно быть? В анкерном тесте или в url? –

+0

Я бы посоветовал вам использовать некоторую библиотеку для выполнения тяжелой работы. В этом случае вы можете перейти к компоненту [symfony DomCrawler] (http://symfony.com/doc/current/components/dom_crawler.html) + [symfony CssSelector component] (http://symfony.com/doc/current /components/css_selector.html). Они предназначены для совместной работы, вы можете использовать jQuery, как селектор в PHP, вам просто нужно кормить DomCrawler с помощью строки с веб-страницы. – mTorres

ответ

0

что-то вроде этого:

$html = file_get_contents("http://www.example.es"); 
$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$results = array(); 

$tags = $dom->getElementsByTagName('a'); 
foreach ($tags as $tag) { 
     $url = $tag->getAttribute('href'); 
     if (strpos($url,"apple") !== false){ //"apple" is the word to search for 
      $results[] = $url; 
     } 

     //or search for the word in the hyperlink text 
     if (strpos($tag->nodeValue,"apple") !== false){ 
      $results[] = $url; 
     } 
} 

$results будет содержать массив всех URL-адресов, содержащих слово apple.

Как уже отмечал birdppider, поиск ссылок неэффективен с использованием RegEx. Анализ синтаксического кода документа происходит от: PHP String Manipulation: Extract hrefs.

1

Если вы имеете в виду конкретный текст слово якорь, вы можете использовать:

/<a.+href=["'](.*)["'].*>(.*(?:test|aa).*)<\/a>/isgmU 

Demo

В приведенном выше примере все анкеры установлено, что есть слово test или aa в якорный текст.

Если вы хотите только анкеры с определенным словом внутри якоря вы можете использовать:

/<a[^>]+href=["']([^>]*(?:test|aa)[^>]*)["'][^>]*>(.*)<\/a>/isgmU 

Demo

Однако те, кто не будет работать во всех случаях, но для простого соответствия они должны работать.

Смежные вопросы