/** * The method fetches data with PHPs file get contents and returns it as a string. * * @param string $url the url to fetch from * @return string the fetched file content in UTF8 * @throws Exception */ public function fetch($url) { set_error_handler(create_function('$severity, $message', 'throw new ErrorException($message);')); try { $data = file_get_contents($url); restore_error_handler(); return ForceUTF8\Encoding::toUTF8($data); } catch (Exception $e) { throw $e; } }
/** * The method fetches data with curl and returns it as a string. * * @param string $url the url to fetch from * @return string the fetched file content in UTF8 */ public function fetch($url) { $timeout = 1; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_COOKIEJAR, "curlCookies.txt"); curl_setopt($ch, CURLOPT_COOKIEFILE, "curlCookies.txt"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0"); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded; charset=utf-8')); $data = curl_exec($ch); curl_close($ch); return ForceUTF8\Encoding::toUTF8($data); }
/** * Dans le code $fullHtml, remplace la chaîne $needle par l'élément $replace. Cette fonctionnalité sert par exemple à insérer un * bouton 'lire la suite' à la place du marqueur {{LIRE_LA_SUITE}} dans un bloc de texte qu'on ne veut pas afficher entièrement. * @param string $fullHtml Le code HTML à traiter * @param string $needle Le marqueur * @param string $replace Le code de remplacement * @return string|bool Le code HTML modifié, false en cas d'erreur * @throws \Exception */ public function trimFromHTMLString($fullHtml, $needle, $replace = "") { $text = trim(html_entity_decode($fullHtml)); if (!Inflector::seemsUtf8($text)) { // @internal Conserver ce bloc car le serveur de production pose des problèmes d'encodage... require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'ForceUTF8' . DIRECTORY_SEPARATOR . 'Encoding.php'; $text = ForceUTF8\Encoding::toUTF8($text); } // On charge le texte dans un DOMDocument pour le manipuler proprement $this->dom = new DOMDocument(); $htmlHead = '<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title>***</title></head><body>'; $htmlFoot = '</body></html>'; if (!$this->dom->loadHTML($htmlHead . $text . $htmlFoot)) { Yii::log(h::_("Erreur sur loadXML()\n{$text}", __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); return false; } // On récupère le noeud texte contenant $needle. // Si aucun noeud n'a été trouvé, on renvoie le texte complet tel qu'on l'a reçu. $zeunode = $this->findStringNode($needle, $this->dom); if (!$zeunode) { Yii::log(h::_("!!!! Pas de noeud contenant -> {$needle} <-", __FILE__, __LINE__, __METHOD__), 'debug'); Yii::log(h::_(h::xmlTreeDump($this->dom), __FILE__, __LINE__, __METHOD__), 'debug'); return $fullHtml; } // On supprime tout le texte après $needle et tous les noeuds suivant $zeunode $zeunode->data = preg_replace("/({$needle}).*/ms", "\$1", $zeunode->data); $this->removeNextNodes($zeunode); $out = $this->dom->saveHTML(); // On retire le code HTML ajouté de part et d'autre de $text // On remplace le marqueur $needle par le code HTML $replace if (($pos = strpos($out, $htmlHead)) === false) { Yii::log(h::_("Erreur sur : strpos({$htmlHead}, {$out})", __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); } else { $out = substr($out, $pos + strlen($htmlHead)); } $out = str_replace($htmlFoot, '', $out); $out = trim(preg_replace("/{$needle}/", $replace, $out)); return $out; }