PHP file_get_contents () и строка запроса - PullRequest
0 голосов
/ 25 мая 2011

У меня проблема - парсер, который не разбирает. Это не работает! Это ничего не возвращает! Что ж, я хочу получить что-нибудь обратно и сохранить результаты в базе данных mysql.

<?PHP
// Original PHP code by Chirp Internet: http://www.chirp.com.au
// Please acknowledge use of this code by including this header.

$url = "http://www.edi.admin.ch/esv/00475/00698/index.html?lang=de";

//$input = @file_get_contents($url) or die("Could not access file: $url");

$input = file_get_contents($url) or die("Could not access file: $url"); 

$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER))
{
    foreach($matches as $match) 
    {
        // $match[2] = all the data i want to collect...
        // $match[3] = text that i need to collect - see a detail-page
    }
}
?>

Это идет мне на ум: не дает никаких результатов. Нужно ли использовать file_get_contents() со строкой запроса?

Ответы [ 3 ]

4 голосов
/ 25 мая 2011

Хорошо работает здесь:

$url = "http://www.edi.admin.ch/esv/00475/00698/index.html?lang=de";

$doc = new DOMDocument();
// Supress warnings for screwy HTML
@$doc->loadHTMLFile($url);

// Use DOM functionality to get all links
$link_list = $doc->getElementsByTagName('a');

$links = array(); 
foreach($link_list as $link) {
  if($link->getAttribute('href')) {
    // and put their href attributes and
    // text content in an array
    $link_info['href'] = $link->getAttribute('href');
    $link_info['text'] = $link->nodeValue;
    $links[] = $link_info;
  }
}

print_r($links);

Выход:

Array
(
    [0] => Array
        (
            [href] => #webNavigationDiv
            [text] => Direkt zur Navigation [Alt + 1]
        )

    [1] => Array
        (
            [href] => #contentStart
            [text] => Direkt zum Inhalt [Alt + 2] 
        )

    [2] => Array
        (
            [href] => #keywords_fast
            [text] => Direkt zur Suche [Alt + 5]
        )
3 голосов
/ 25 мая 2011

Вы делаете то, что не должны делать & ndash; парсинг HTML с помощью регулярных выражений Не делай этого!

Вместо этого используйте функции анализа DOM. Класс PHP DOMDocument довольно прост в использовании и гораздо более разборчив (и стабилен), чем регулярные выражения:

$dom = new DOMDocument;
$dom->loadHTML($yourHTML);

$links = $dom->getElementsByTagName('a');

$hrefs = array();
foreach ($links as $link) {
    $hrefs[] = $link->getAttribute('href');
}

Получение других данных, таких как текстовое содержимое или имена других атрибутов, тривиально легко, если вы хотите это сделать.

2 голосов
/ 25 мая 2011

Вы можете использовать fopen-подобные функции только с URL-адресом, если включена соответствующая оболочка fopen.

См .: http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen

Хотя я бы сказал, что «регулярное выражение не годится для html», если это просто небольшой сценарий, кого это волнует? При этом DOMDocument и друзья достаточно просты в использовании.

Josh

...