PHP: comment charger le fichier depuis un serveur différent en tant que chaîne?

StackOverflow https://stackoverflow.com/questions/934921

  •  06-09-2019
  •  | 
  •  

Question

Je suis en train de charger un fichier XML à partir d'un nom de domaine différent en tant que chaîne. Tout ce que je veux est un tableau du texte dans la balise du fichier xml, donc je pense que je suis en utilisant PHP4 la façon la plus simple serait de faire une regex sur elle pour les obtenir. Quelqu'un peut-il expliquer comment charger le XML comme une chaîne? Merci!

Était-ce utile?

La solution

Vous pouvez utiliser cURL comme dans l'exemple ci-dessous. Je dois ajouter que l'analyse syntaxique XML à base regex est généralement pas une bonne idée, et vous pouvez être mieux à l'aide d'un analyseur réel, surtout si elle obtient plus compliquée.

Vous pouvez également ajouter des modificateurs de regex pour le faire fonctionner sur plusieurs lignes, etc., mais je suppose que la question est plus sur récupérer le contenu dans une chaîne.

<?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)); 
}

Autres conseils

première utilisation file_get_contents ( ' http://www.example.com/ ');

pour obtenir le fichier, insérer pour var. après analyser le xml le lien est http://php.net/manual/en/function.xml-parse. php ont par exemple dans les commentaires

Si vous chargez un fichier XML bien formé, ignorer l'analyse syntaxique à base de caractères, et utiliser les fonctions DOM:

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

Si vous ne pouvez pas utiliser DOMDocument :: load () en raison de la façon dont php est mis en place, la boucle d'utilisation pour saisir le fichier, puis faire:

$d = new DOMDocument;
$d->loadXML($grabbedfile);
...

J'ai cette fonction comme un extrait:

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;
}

qui renvoie le code HTML sans sauts de ligne, des onglets, des espaces multiples, etc, seulement 1 ligne.

Alors maintenant, vous le faites preg_match:

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

et $ matches [1], les informations dont vous avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top