PHP: comment charger le fichier depuis un serveur différent en tant que chaîne?
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
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.