Maison > développement back-end > tutoriel php > Comment utiliser DOMDocument en PHP pour traiter des documents HTML et XML

Comment utiliser DOMDocument en PHP pour traiter des documents HTML et XML

藏色散人
Libérer: 2023-04-09 20:10:02
avant
4748 Les gens l'ont consulté

Utilisez DOMDocument en PHP pour traiter des documents HTML et XML

En fait, à partir de PHP5, PHP nous a fourni une classe puissante pour analyser et générer des opérations liées au XML , qui est la classe DOMDocument dont nous allons parler aujourd'hui. Cependant, j'estime que la plupart des gens aimeront toujours utiliser des expressions régulières pour analyser le contenu Web lors de l'exploration de pages Web. Après avoir appris ce cours aujourd'hui, vous pourrez essayer d'utiliser la propre méthode d'analyse de PHP la prochaine fois.

Analyse HTML

// 解析 HTML
$baidu = file_get_contents('https://www.baidu.com');

$doc = new DOMDocument();
@$doc->loadHTML($baidu);

// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);

// object(DOMElement)#2 
//     ....

echo $inputSearch->getAttribute('name'), PHP_EOL; // wd

// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
    $allImageLinks[] = $img->getAttribute('src');
}

print_r($allImageLinks);

// Array
// (
//     [0] => //www.baidu.com/img/baidu_jgylogo3.gif
//     [1] => //www.baidu.com/img/bd_logo.png
//     [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
// )

// 利用 parse_url 分析链接
foreach($allImageLinks as $link){
    print_r(parse_url($link));
}

// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/bd_logo.png
// )
// Array
// (
//     [scheme] => http
//     [host] => s1.bdstatic.com
//     [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )
Copier après la connexion

Cela ne semble-t-il pas si clair et orienté objet ? C'est comme utiliser la bibliothèque ORM pour les opérations de base de données pour la première fois. Regardons-le pièce par pièce.

$baidu = file_get_contents('https://www.baidu.com');

$doc = new DOMDocument();
@$doc->loadHTML($baidu);
Copier après la connexion

La première consiste à charger le contenu du document. C'est plus facile à comprendre. Utilisez la méthode loadHTML() directement pour charger le contenu HTML. Il fournit également plusieurs autres méthodes, à savoir : load() charge du XML à partir d'un fichier ; loadXML() charge du XML à partir d'une chaîne ; loadHTMLFile() charge du HTML à partir d'un fichier ;

// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);

// object(DOMElement)#2 
//     ....

echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
Copier après la connexion

Ensuite, nous utilisons la même API de manipulation DOM que JS front-end pour manipuler des éléments en HTML. Dans cet exemple, vous obtenez la zone de texte de Baidu et utilisez directement la méthode getElementById() pour obtenir l'objet DOMElement avec l'identifiant comme contenu spécifié. Ensuite, vous pouvez obtenir ses valeurs, attributs, etc.

[Recommandations associées : Tutoriel vidéo PHP]

// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
    $allImageLinks[] = $img->getAttribute('src');
}

print_r($allImageLinks);

// Array
// (
//     [0] => //www.baidu.com/img/baidu_jgylogo3.gif
//     [1] => //www.baidu.com/img/bd_logo.png
//     [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
// )

// 利用 parse_url 分析链接
foreach($allImageLinks as $link){
    print_r(parse_url($link));
}

// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/bd_logo.png
// )
// Array
// (
//     [scheme] => http
//     [host] => s1.bdstatic.com
//     [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )
Copier après la connexion

Cet exemple permet d'obtenir tous les liens d'image dans le document HTML. Comparé aux expressions régulières, c'est beaucoup plus pratique et le code lui-même est explicite, il n'est donc pas nécessaire de considérer le problème de l'échec de la correspondance régulière. En coopérant avec une autre méthode parse_url() fournie avec PHP, vous pouvez également analyser le lien très facilement et extraire le contenu souhaité.

L'analyse de XML est similaire à l'analyse de HTML. Les deux peuvent être facilement analysées à l'aide de l'interface de méthode fournie par DOMDocument et DOMElement. Alors que voulons-nous générer un format standard de XML ? Bien sûr, c'est également très simple. Il n'est pas nécessaire de fusionner des chaînes. Vous pouvez utiliser cette classe pour effectuer des opérations basées sur des objets.

Générer un XML

// 生成一个XML文档
$xml = new DOMDocument('1.0', 'UTF-8');

$node1 = $xml->createElement('First', 'This is First Node.');
$node1->setAttribute('type', '1');

$node2 = $xml->createElement('Second');
$node2->setAttribute('type', '2');
$node2_child = $xml->createElement('Second-Child', 'This is Second Node Child.');
$node2->appendChild($node2_child);

$xml->appendChild($node1);
$xml->appendChild($node2);
print $xml->saveXML();

/*
<?xml version="1.0" encoding="UTF-8"?>
<First type="1">This is First Node.</First>
<Second type="2"><Second-Child>This is Second Node Child.</Second-Child></Second>
*/
Copier après la connexion

En fait, tant que vous avez un peu de base JS front-end, il n'est pas difficile de voir le sens de ce code. Utilisez la méthode createElement() pour créer un objet DOMElement, puis ajoutez-y des propriétés et du contenu. Utilisez la méthode appendChild() pour ajouter des nœuds subordonnés au DOMElement ou DOMDocument actuel. Enfin, utilisez saveXML() pour générer du contenu au format XML standard.

Résumé

À travers les deux exemples simples ci-dessus, je pense que tout le monde est déjà très intéressé par la façon dont ce DOMDocument exploite l'analyse des fichiers de classe XML. Cependant, il n'existe aucun test pertinent sur la différence entre leurs performances et la méthode d'analyse classique. Cependant, dans des circonstances normales, le document HMTL du site Web ne sera pas trop volumineux. Après tout, chaque site Web prendra également en compte sa propre vitesse de chargement. .Si le document S'il est très volumineux, l'expérience utilisateur sera médiocre, il n'y a donc fondamentalement aucun problème à utiliser cet ensemble d'interfaces pour l'analyse et le traitement quotidiens des robots.

Code du test :

https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/PHP%E4%B8%AD%E4%BD%BF%E7%94%A8DOMDocument%E6%9D%A5%E5%A4%84%E7%90%86HTML%E3%80%81XML%E6%96%87%E6%A1%A3.php
Copier après la connexion

Document de référence :
https://www.php.net/manual/zh/class.domdocument.php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal