在 PHP 中解析 HTML

Olorunfemi Akinlua 2023年1月30日 2022年7月18日
  1. 使用 DomDocument() 在 PHP 中解析 HTML
  2. 在 PHP 中使用 simplehtmldom 解析 HTML
  3. 在 PHP 中使用 DiDOM 解析 HTML
在 PHP 中解析 HTML

解析 HTML 允許我們將其內容或標記轉換為字串,從而更容易分析或建立動態 HTML 檔案。更詳細地說,它獲取原始 HTML 程式碼,讀取它,生成從段落到標題的 DOM 樹物件結構,並允許我們提取重要或需要的資訊。

我們使用內建庫解析 HTML 檔案,有時使用第三方庫來進行網頁抓取或 PHP 內容分析。根據方法的不同,目標是將 HTML 文件正文轉換為字串以提取每個 HTML 標記。

本文將討論內建類 DomDocument() 和兩個第三方庫 simplehtmldomDiDOM

使用 DomDocument() 在 PHP 中解析 HTML

無論是本地 HTML 檔案還是線上網頁,DOMDocument()DOMXpath() 類都有助於解析 HTML 檔案並將其元素儲存為字串,或者在我們的示例中儲存為陣列。

讓我們使用函式解析這個 HTML 檔案並返回標題、子標題和段落。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <h2 class="main">Welcome to the Abode of PHP</h2>
        <p class="special">
            PHP has been the saving grace of the internet from its inception, it
            runs over 70% of website on the internet
        </p>
        <h3>Understanding PHP</h3>
        <p>
            Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eum minus
            eos cupiditate earum et optio culpa, eligendi facilis laborum
            dolore.
        </p>
        <h3>Using PHP</h3>
        <p>
            Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eum minus
            eos cupiditate earum et optio culpa, eligendi facilis laborum
            dolore.
        </p>
        <h3>Install PHP</h3>
        <p>
            Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eum minus
            eos cupiditate earum et optio culpa, eligendi facilis laborum
            dolore.
        </p>
        <h3>Configure PHP</h3>
        <p>
            Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eum minus
            eos cupiditate earum et optio culpa, eligendi facilis laborum
            dolore.
        </p>

        <h2 class="main">Welcome to the Abode of JS</h2>
        <p class="special">
            PHP has been the saving grace of the internet from its inception, it
            runs over 70% of website on the internet
        </p>
        <h3>Understanding JS</h3>
        <p>
            Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eum minus
            eos cupiditate earum et optio culpa, eligendi facilis laborum
            dolore.
        </p>
    </body>
</html>

PHP 程式碼:

<?php

$html = 'index.html';

function getRootElement($element, $html)
{
    $dom = new DomDocument();

    $html = file_get_contents($html);

    $dom->loadHTML($html);

    $dom->preserveWhiteSpace = false;

    $content = $dom->getElementsByTagName($element);

    foreach ($content as $each) {
        echo $each->nodeValue;
        echo "\n";
    }
}

echo "The H2 contents are:\n";
getRootElement("h2", $html);
echo "\n";

echo "The H3 contents are:\n";
getRootElement("h3", $html);
echo "\n";

echo "The Paragraph contents include\n";
getRootElement("p", $html);
echo "\n";

程式碼片段的輸出是:

The H2 contents are:
Welcome to the Abode of PHP
Welcome to the Abode of JS

The H3 contents are:
Understanding PHP
Using PHP
Install PHP
Configure PHP
Understanding JS

The Paragraph contents include

PHP has been the saving grace of the internet from its inception, it
runs over 70% of the website on the internet

...

在 PHP 中使用 simplehtmldom 解析 HTML

對於 CSS 樣式選擇器等附加功能,你可以使用名為 Simple HTML DOM Parser 的第三方庫,這是一個簡單快速的 PHP 解析器。你可以下載它幷包含或需要單個 PHP 檔案。

通過此過程,你可以輕鬆解析所需的所有元素。使用與上一節相同的程式碼片段,我們將使用名為 str_get_html() 的函式解析 HTML,該函式處理 HTML 並使用 find() 方法查詢特定的 HTML 元素或標記。

要查詢具有特殊 class 的元素,我們需要將 class 選擇器應用於每個 find 元素。此外,要找到實際文字,我們需要在元素上使用 innertext 選擇器,然後將其儲存在陣列中。

使用與上一節相同的 HTML 檔案,讓我們使用 simplehtmldom 解析它。

<?php

require_once('simple_html_dom.php');

function getByClass($element, $class)
{
    $content= [];

    $html = 'index.html';

    $html_string = file_get_contents($html);

    $html = str_get_html($html_string);

    foreach ($html->find($element) as $element) {
        if ($element->class === $class) {
            array_push($heading, $element->innertext);
        }
    }

    print_r($content);
}

getByClass("h2", "main");
getByClass("p", "special");

程式碼片段的輸出是:

Array
(
    [0] => Welcome to the Abode of PHP
    [1] => Welcome to the Abode of JS
)
Array
(
    [0] =>               PHP has been the saving grace of the internet from its inception, it              runs over 70% of the website on the internet
    [1] =>               PHP has been the saving grace of the internet from its inception, it              runs over 70% of the website on the internet
)

在 PHP 中使用 DiDOM 解析 HTML

對於這個第三方 PHP 庫,我們必須使用一個名為 Composer 的 PHP 依賴項管理器,它允許我們管理所有 PHP 庫和依賴項。DiDOM 庫可通過 GitHub 獲得,它提供比其他庫更高的速度和記憶體管理。

如果沒有,可以安裝在這裡安裝 Composer。但是,如果你有,以下命令會將 DiDOM 庫新增到你的專案中。

composer require imangazaliev/didom

之後,你可以使用下面的程式碼,它與 simplehtmldom 的結構類似,帶有 find() 方法。有一個 text(),它將 HTML 元素上下文轉換為我們可以在程式碼中使用的字串。

has() 函式允許你檢查 HTML 字串中是否有元素或類,並返回一個布林值。

<?php

use DiDom\Document;

require_once('vendor/autoload.php');

$html = 'index.html';

$document = new Document('index.html', true);

echo "H3 Element\n";

if ($document->has('h3')) {
    $elements = $document->find('h3');
    foreach ($elements as $element) {
        echo $element->text();
        echo "\n";
    }
}

echo "\nElement with the Class 'main'\n";

if ($document->has('.main')) {
    $elements = $document->find('.main');
    foreach ($elements as $element) {
        echo $element->text();
        echo "\n";
    }
}

程式碼片段的輸出是:

H3 Element
Understanding PHP
Using PHP
Install PHP
Configure PHP
Understanding JS

Element with the Class 'main'
Welcome to the Abode of PHP
Welcome to the Abode of JS
Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

相關文章 - PHP HTML