Charger le code HTML de la page
<?php
class WebLoader {
/**
* User agent de la requete
* Chrome 11 sur Linux
*/
const USERAGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36';
/**
* Délai max
* 5 secondes
*/
const TIMEOUT = 5; //5 sec
/**
* Résultat de la requete
* Si différent de 200, une erreur est survenue
* @var int
*/
static public int $http_code = 404;
/**
* Charger le code HTML
* @param string $url
* @return type
*/
static public function get_url(string $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_TIMEOUT, self::TIMEOUT);
curl_setopt($ch, CURLOPT_USERAGENT, self::USERAGENT);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
$buf = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
//Erreur interne
if (!isset($info['total_time']) || !isset($info['http_code'])) {
self::$http_code = 500;
}
//Dépassement du délai
else if (isset($info['total_time']) && $info['total_time'] > self::TIMEOUT) {
self::$http_code = 408;
}
//Les autres cas
else {
self::$http_code = intval($info['http_code']);
}
return $buf;
}
}
Exemple d'utilisation de la class WebLoader
<?php
/**
* Charger la page internet
*/
$URL = 'https://fr.wikipedia.org/wiki/PHP';
$html = WebLoader::get_url($URL);
//Vérifier le chargement de la page
if (WebLoader::$http_code != 200) {
echo 'Echec du chargement de la page internet';
exit(0);
}
Lister les titres de la page Wikipedia
class="sidebar-toc-list-item sidebar-toc-level-1">
<a class="sidebar-toc-link" href="#Présentation">
<div class="sidebar-toc-text">
<span class="sidebar-toc-numb">1</span>Présentation</div>
</a>
<ul id="toc-Présentation-sublist" class="sidebar-toc-list">
</ul>
</li>
Extraire des données avec un Regex
La première technique est d'utiliser un parseur utilisant les Regex. L'avantage de cette méthode est sa rapidité et qu'elle s'adapte à tous les types de texte.<?php
$URL = 'https://fr.wikipedia.org/wiki/PHP';
$html = WebLoader::get_url($URL);
//Vérifier le chargement de la page
if (WebLoader::$http_code != 200) {
echo 'Echec du chargement de la page internet';
exit(0);
}
$list_title = HtmlParser::list_title($html);
var_dump($list_title);
class HtmlParser {
/**
* Regex d'extraction des titres
*/
const PATTERN = '/<span class="sidebar-toc-numb">([\d.]*)<\/span>([\w\s\.]*)<\/div>/u';
static public function list_title(string $html): array {
$b = preg_match_all(self::PATTERN, $html, $matches);
//Echec de la fonction
if (!$b || !isset($matches[2][0])) {
return [];
}
//Lister le numéro et le libellé des titres
$list_title = [];
for ($i = 0; $i < count($matches[0]); $i++) {
$list_title[] = $matches[1][$i] . ' ' . $matches[2][$i];
}
return $list_title;
}
}
array(26) {
[0]=>
string(15) "1 Présentation"
[1]=>
string(10) "2 Histoire"
[2]=>
string(15) "2.1 Utilisation"
[3]=>
string(12) "2.2 Versions"
[4]=>
string(17) "2.2.1 Version 8.1"
.....
Extraire un bloc de donnée avec Xpath
<span class="o"><?=</span> <span class="s1">'Hello World'</span>
<?php
$URL = 'https://fr.wikipedia.org/wiki/PHP';
$html = WebLoader::get_url($URL);
//Vérifier le chargement de la page
if (WebLoader::$http_code != 200) {
echo 'Echec du chargement de la page internet';
exit(0);
}
/*$list_cs = HtmlParser::list_code_source($html);
var_dump($list_cs);*/
class HtmlParser {
static public function list_code_source(string $html): array {
$list_cs = [];
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$elements = $xpath->query('//div[@class="mw-highlight mw-highlight-lang-php mw-content-ltr"]');
foreach ($elements as $element) {
$list_cs[]=$element->nodeValue;
}
return $list_cs;
}
}