2009-06-01 7 views
2

J'essaie de charger un fichier XML à partir d'un nom de domaine différent sous la forme d'une chaîne. Tout ce que je veux, c'est un tableau du texte dans les balises < title> </title> du fichier xml, donc je pense que puisque j'utilise php4, le plus simple serait de faire une regex dessus pour les obtenir. Quelqu'un peut-il expliquer comment charger le XML en tant que chaîne? Merci!PHP: comment charger un fichier à partir d'un serveur différent sous forme de chaîne?

Répondre

2

Vous pouvez utiliser cURL comme dans l'exemple ci-dessous. Je devrais ajouter que l'analyse XML basée sur regex n'est généralement pas une bonne idée, et vous feriez peut-être mieux d'utiliser un vrai parser, surtout si cela devient plus compliqué.

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 l'extraction du 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)); 
} 
2

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

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

+0

Merci vous, je me suis cette erreur: « avertissement: file_get_contents(): accès aux fichiers URL est désactivé dans la configuration du serveur. » Y at-il un moyen de le faire avec cURL Je sais que c'est activé. Merci! –

+0

vous pouvez l'utiliser // URL fictive vers un fichier existant sans données (fichier 0 octet) $ url = 'http://www.example.com/empty_fichier.txt'; $ curl = curl_init(); curl_setopt ($ curl, CURLOPT_URL, $ url); curl_setopt ($ curl, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ curl, CURLOPT_HEADER, false); // exécuter et renvoyer une chaîne (cela devrait être une chaîne vide '') $ str = curl_exec ($ curl); curl_close ($ curl); // la valeur de $ str est en fait bool (true), pas la chaîne vide '' var_dump ($ str); –

+0

je le prends de http://php.net/manual/fr/function.curl-exec.php –

1

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 faites cela preg_match:

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

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

2

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); 
... 
Questions connexes