Hướng dẫn tạo mục lục tự động cho bài viết bằng PHP

Bài viết hướng dẫn bạn cách tạo mục lục tự động cho nội dung bài viết bằng PHP, sử dụng lớp `DOMDocument` để phân tích cú pháp HTML và tạo cấu trúc mục lục với các tiêu đề.

Trong bài viết này, chúng ta sẽ tìm hiểu cách tạo mục lục tự động cho bài viết bằng PHP. Bằng cách sử dụng hàm generateTOC, chúng ta sẽ phân tích nội dung HTML và tự động thêm các ID cho các tiêu đề, sau đó tạo ra một danh sách các liên kết đến các tiêu đề đó.

Mã PHP:

<?php

function generateTOC($content) {
    // Load HTML content
    $dom = new DOMDocument();
    $contentType = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
    @$dom->loadHTML($contentType . $content);

    // Find all headers and add IDs
    $headers = $dom->getElementsByTagName('*');
    $toc = [];
    foreach ($headers as $header) {
        if (in_array($header->nodeName, ['h1', 'h2', 'h3', 'h4'])) {
            $id = str_slug($header->textContent);
            $header->setAttribute('id', $id);
            $toc[] = [
                'tag' => $header->nodeName,
                'text' => $header->textContent,
                'id' => $id
            ];
        }
    }

    // Generate TOC HTML with nested structure
    $tocHtml = buildNestedTOC($toc);
    if($tocHtml) {
        $tocHtml = '<div id="toc"><div id="toc-title"><strong>Table Of Contents</strong></div>' . $tocHtml . '</div>';
    }

    return $tocHtml . $dom->saveHTML();
}

function buildNestedTOC($toc) {
    $html = '';
    $prevLevel = 0;
    foreach ($toc as $item) {
        $currentLevel = (int) substr($item['tag'], 1);

        if ($prevLevel == 0) {
            $html .= '<ul>';
        } elseif ($currentLevel > $prevLevel) {
            $html .= '<ul>';
        } elseif ($currentLevel < $prevLevel) {
            $html .= str_repeat('</ul>', $prevLevel - $currentLevel);
        }

        $html .= '<li><a href="#' . htmlspecialchars($item['id']) . '">' . htmlspecialchars($item['text']) . '</a></li>';
        $prevLevel = $currentLevel;
    }
    $html .= str_repeat('</ul>', $prevLevel);

    return $html;
}

function str_slug($string) {
    // Chuyển đổi chuỗi thành slug (chuỗi không dấu)
    $slug = preg_replace('/[^A-Za-z0-9-]+/', '-', $string);
    return strtolower(trim($slug, '-'));
}

// Ví dụ sử dụng
$content = '<h1>Tiêu đề chính</h1><h2>Tiêu đề phụ 1</h2><h3>Tiêu đề con 1.1</h3><h2>Tiêu đề phụ 2</h2>';
echo generateTOC($content);

?>

Giải thích chi tiết từng dòng code:

  1. function generateTOC($content): Định nghĩa hàm generateTOC nhận vào nội dung HTML.
  2. $dom = new DOMDocument();: Khởi tạo một đối tượng DOMDocument để xử lý HTML.
  3. $contentType = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';: Thiết lập thông tin loại nội dung.
  4. @$dom->loadHTML($contentType . $content);: Tải nội dung HTML vào đối tượng DOMDocument. Dấu @ giúp ẩn thông báo lỗi nếu có.
  5. $headers = $dom->getElementsByTagName('*');: Lấy tất cả các phần tử trong tài liệu.
  6. foreach ($headers as $header) {...}: Duyệt qua từng phần tử và tìm các tiêu đề (h1, h2, h3, h4).
  7. if (in_array($header->nodeName, ['h1', 'h2', 'h3', 'h4'])) {...}: Kiểm tra xem phần tử có phải là tiêu đề không.
  8. $id = str_slug($header->textContent);: Tạo ID từ nội dung tiêu đề bằng hàm str_slug.
  9. $header->setAttribute('id', $id);: Thêm thuộc tính ID vào tiêu đề.
  10. $toc[] = [...];: Thêm thông tin tiêu đề vào mảng $toc để tạo mục lục.
  11. $tocHtml = buildNestedTOC($toc);: Gọi hàm buildNestedTOC để tạo mã HTML cho mục lục.
  12. if($tocHtml) {...}: Nếu có mục lục, tạo phần HTML cho mục lục.
  13. return $tocHtml . $dom->saveHTML();: Trả về mục lục và nội dung HTML gốc.

Yêu cầu hệ thống:

  • PHP >= 7.0
  • Không cần cài đặt thêm thư viện nào.

Lời khuyên:

  • Hàm str_slug có thể được điều chỉnh để xử lý các ký tự đặc biệt theo yêu cầu của bạn.
  • Tạo mục lục giúp người đọc dễ dàng điều hướng và tìm kiếm thông tin trong bài viết dài.


Các Hướng Dẫn Cùng Chủ Đề Đang Xem

Cách gọi hàm PHP từ chuỗi được lưu trong biến

Hướng dẫn cách gọi một hàm PHP từ một chuỗi được lưu trong biến bằng cách sử dụng tính năng gọi hàm động trong PHP. Bài viết sẽ giới thiệu cách thực hiện với các ví dụ minh họa.
Cách ghi nội dung vào file Excel bằng PHP

Hướng dẫn chi tiết cách ghi nội dung vào file Excel bằng PHP bằng cách sử dụng thư viện PHPExcel hoặc thư viện mới hơn là PhpSpreadsheet.
Cách kiểm tra chuỗi con trong chuỗi lớn bằng PHP

Hướng dẫn cách sử dụng hàm `strpos` trong PHP để kiểm tra sự tồn tại của chuỗi con trong một chuỗi lớn. Đây là phương pháp đơn giản và hiệu quả để xử lý chuỗi trong PHP.
Lấy ký tự cuối cùng của chuỗi trong PHP

Hướng dẫn cách sử dụng PHP để lấy ký tự cuối cùng của một chuỗi. Mã PHP này giúp bạn dễ dàng truy xuất ký tự cuối của chuỗi văn bản trong các thao tác xử lý chuỗi.
Cách truyền Authentication Header Token khi POST dữ liệu tới API bằng PHP

Hướng dẫn chi tiết cách sử dụng cURL trong PHP để truyền `Authentication Header Token` khi POST dữ liệu tới API. Giải pháp này giúp bảo mật và xác thực các yêu cầu tới API.
Cách trích xuất số từ chuỗi trong PHP

Bài viết này hướng dẫn cách trích xuất các số từ chuỗi trong PHP bằng nhiều cách khác nhau như sử dụng regex (biểu thức chính quy), các hàm PHP có sẵn như `preg_match_all`, `filter_var`, và các phương pháp thủ công.
Ví dụ về Singleton Pattern trong PHP

Hướng dẫn về Singleton Pattern trong PHP, bao gồm ví dụ cụ thể giúp bạn hiểu cách sử dụng mẫu thiết kế này trong lập trình hướng đối tượng.
Kiểm tra chuỗi có phải là chuỗi nhị phân hay không bằng PHP

Hướng dẫn cách kiểm tra chuỗi trong PHP xem chuỗi đó có phải là chuỗi nhị phân hay không (chỉ bao gồm các ký tự `0` và `1`). Bài viết sử dụng các hàm xử lý chuỗi cơ bản trong PHP.
Ví dụ về Factory Pattern trong PHP

Hướng dẫn về Factory Pattern trong PHP với ví dụ cụ thể giúp bạn hiểu rõ cách sử dụng mẫu thiết kế này trong lập trình hướng đối tượng.
Cách chuyển chuỗi Markdown sang HTML bằng PHP

Hướng dẫn cách chuyển đổi chuỗi Markdown sang HTML trong PHP bằng cách sử dụng thư viện `Parsedown`, giúp bạn hiển thị nội dung Markdown một cách hiệu quả trên trang web của mình.

Đã thêm vào giỏ hàng