PHP: как загрузить файл с другого сервера в виде строки? - PullRequest
2 голосов
/ 01 июня 2009

Я пытаюсь загрузить файл XML из другого доменного имени в виде строки. Все, что мне нужно, - это массив текста в тегах файла xml, поэтому я думаю, что, поскольку я использую php4, самый простой способ - использовать регулярные выражения для их получения. Может кто-нибудь объяснить, как загрузить XML в виде строки? Спасибо!

Ответы [ 4 ]

2 голосов
/ 10 июня 2010

Если вы загружаете правильно сформированный xml, пропустите синтаксический анализ и используйте функции DOM:

$d = new DOMDocument;
$d->load("http://url/file.xml");
$titles = $d->getElementsByTagName('title');
if ($titles) {
    echo $titles->item(0)->nodeValue;
}

Если вы не можете использовать DOMDocument :: load () из-за того, как настроен php, используйте curl, чтобы получить файл, а затем выполните:

$d = new DOMDocument;
$d->loadXML($grabbedfile);
...
2 голосов
/ 01 июня 2009

Вы можете использовать cURL, как в примере ниже. Я должен добавить, что синтаксический анализ XML на основе регулярных выражений, как правило, не очень хорошая идея, и вам может быть лучше использовать реальный анализатор, особенно если он усложняется.

Возможно, вы также захотите добавить некоторые модификаторы регулярных выражений, чтобы заставить его работать в нескольких строках и т. Д., Но я предполагаю, что вопрос больше в извлечении содержимого в строку.

<?php

$curl = curl_init('http://www.example.com');

//make content be returned by curl_exec rather than being printed immediately                                 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($curl);

if ($result !== false) {
    if (preg_match('|<title>(.*)</title>|i', $result, $matches)) {
        echo "Title is '{$matches[1]}'";   
    } else {
        //did not find the title    
    }
} else {
    //request failed
    die (curl_error($curl)); 
}
2 голосов
/ 01 июня 2009

первое использование file_get_contents ('http://www.example.com/');

чтобы получить файл, вставить в вар. после разбора xml ссылка http://php.net/manual/en/function.xml-parse.php есть пример в комментариях

1 голос
/ 01 июня 2009

У меня есть эта функция как фрагмент:

function getHTML($url) {
    if($url == false || empty($url)) return false;
    $options = array(
        CURLOPT_URL            => $url,     // URL of the page
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_USERAGENT      => "spider", // who am i
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 3,       // stop after 3 redirects
    );

    $ch      = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $header  = curl_getinfo( $ch );
    curl_close( $ch );

    //Ending all that cURL mess...


    //Removing linebreaks,multiple whitespace and tabs for easier Regexing
    $content = str_replace(array("\n", "\r", "\t", "\o", "\xOB"), '', $content);
    $content = preg_replace('/\s\s+/', ' ', $content);
    $this->profilehtml = $content;
    return $content;
}

Возвращает HTML без разрывов строк, табуляции, нескольких пробелов и т. Д., Только 1 строка

Итак, теперь вы делаете это preg_match:

$html = getHTML($url)
preg_match('|<title>(.*)</title>|iUsm',$html,$matches);

и $ match [1] будут содержать необходимую информацию.

...