2013-11-08 3 views
-2

Мне нужно использовать сканеры для моего проекта.сопоставление URL-адреса шаблону с использованием php

Я использовал простой класс dom, чтобы получить все ссылки со страницы.

Теперь я хочу отфильтровать только те ссылки, которые имеют форму "https://stackoverflow.com/questions/3904482/<title of the question".

Вот моя попытка:

include_once('simple_html_dom.php'); 
$html = new simple_html_dom(); 
$html->load_file('http://stackoverflow.com/questions?sort=newest'); 
$pat='#^/question/([0-9]+)/#'; 
foreach($html->find('a') as $link) 
{ 
    echo preg_match($pat, $link->href); 
    { 
     echo $link->href."<br>"; 
    } 
} 

Все ссылки отфильтрованы.

+4

Вы говорите, что URL-адрес задан ** s **, но ваш рисунок не отображает s –

+0

@ user2969918 Имейте m Ответ я работал для вас? :) –

ответ

1

вы говорите, что URL является вопрос * сек * но ваш рисунок не показывает S

Кроме того, похоже, что вы должны использовать if не echo

include_once('simple_html_dom.php'); 
$html = new simple_html_dom(); 
$html->load_file('http://stackoverflow.com/questions?sort=newest'); 
$pat='#^/questions/([0-9]+)/#'; 
foreach($html->find('a') as $link) 
{ 

    if (preg_match($pat, $link->href)) 
    { 
     echo $link->href."<br>"; 
    } 
} 
1

Вы можете воспользоваться DOM и XPath:

<?php 

$dom = new DOMDocument; 
@$dom->loadHTMLFile('http://stackoverflow.com/questions?sort=newest'); 
$xpath = new DOMXPath($dom); 
$questions = $xpath->query("//a[contains(@href, '/questions/') and not(contains(@href, '/tagged/')) and not(contains(@href, '/ask'))]"); 

foreach ($questions as $question) { 
    print "{$question->getAttribute('href')} => {$question->nodeValue}"; 
} 
+0

Выглядит хорошо, но если используется оператор '@', значение '$ dom', возможно, должно быть проверено':) '. – halfer

+0

Да, я использовал его здесь, чтобы отключить 'loadHTMLFile()' выходные предупреждения (для неформованных файлов). Другой способ сделать это - вызывать 'libxml_use_internal_errors (true);' как раз раньше. :) –

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