WordPress 6.5 對HTML API 進行了重大更新。值得注意的是,標簽處理器進行了重大修改,使其能夠掃描 HTML文檔中的每個標記并解鎖一系列廣泛的新功能。HTML處理器比WordPress 6.4 中最低限度引入時支持更多的 HTML規范。
標簽處理器中的新功能。
標簽處理器旨在掃描 HTML文檔中的每個標簽,跳過所有非標簽標記。在 WordPress 6.5 中,它可以掃描所有內容。令牌是構成文檔的基本部分;對于 HTML,它們是標簽、注釋、文檔類型定義和文本節點。這意味著現在可以讀取 HTML 文檔的文本內容,簡化以前復雜的操作,例如剝離標簽或截斷 HTML。
支持這項工作的是引入了一個稱為可修改文本的新概念。可修改的文本表示標記邊界內的內容,或者可以更改而不影響整個文檔結構的內容。不同的標記包含不同類型的可修改文本:
- 文本節點的整個范圍都是可修改的文本。
- HTML 注釋的內部內容是可修改的文本。
- 特殊元素的開始標簽和結束標簽之間的內容是可修改的內容。
在這種情況下,特殊元素是指其內部內容不能包含其他 HTML 標簽的元素。其中包括 SCRIPT 和 STYLE 元素的內容以及 TITLE 和 TEXTAREA 元素的內容。還有一些代表已棄用或無效的語法:請參閱類文檔以獲取完整列表。
新方法。
next_token()前進到文檔中的下一個標記,包括結束標記。與此方法不同的next_tag()是,沒有查詢。它掃描一切。get_token_type()指示找到哪種標記,例如 a#tag或#text或#comment。get_token_name()返回一個大致對應于 DOM 的值nodeName,例如SPANor#textorhtml(對于 doctype 聲明)。get_modifiable_text()返回匹配標記的正確解碼的文本內容。get_comment_type()指示為什么標記是注釋,因為不同類型的無效標記會變成 HTML 注釋。例如,<?![CDA?TA[?text]?]>是該類型的 HTML 注釋COMMENT_AS_CDATA_LOOKALIKE,因為它看起來好像是 CDATA 部分,而 HTML 內容中不存在該部分。paused_at_incomplete_token()指示標簽處理器是否到達文檔末尾的標記中間。例如,它可能在標簽中間被截斷。
用法示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$title = null;$text_content = '';$processor = new WP_HTML_Tag_Processor( $html );while ( $processor->next_token() ) { if ( '#text' === $processor->get_token_type() ) { $text_content .= $processor->get_modifiable_text(); } elseif ( null === $title && 'TITLE' === $processor->get_token_name() ) { $title = $processor->get_modifiable_text(); }}echo $title ? $title : '(untitled post)';echo "\n\n";echo $text_content; |
HTML 處理器中的擴展支持。
WordPress 現在能夠識別并正確解析大多數 HTML。只有少數幾個主要例外。
- HTML 處理器在遇到 FORM、MATH、SVG、TABLE 或 TEMPLATE 標記時都會退出。這些元素引入了復雜的解析規則,需要額外的關注、測試和設計工作。
- 有時,HTML 解析器需要隱式創建 HTML 本身不存在的元素,或者需要將標記移動到文檔中較早的位置。這需要進一步的設計工作來正確傳達文檔已追溯更改的信息。
- 如果 HTML 處理器被饋送到 BODY 元素外部存在的完整 HTML 文檔或片段(例如文檔 HEAD),那么它將中止,因為它當前僅支持解析 BODY 上下文內的 HTML。
最后一點強調,HTML 處理器是根據塊相關代碼的需求而開發的,并重點關注 HTML 規范中與如何在 BODY 元素內解釋標簽相關的規則。完成此部分后,將添加其他部分。值得慶幸的是,從長遠來看,這是最難的部分,在完成主要工作后應該很快就能解析完整的文檔。
實驗者注意事項。
如果您一直在嘗試 HTML API 并構建標簽處理器的自定義子類,那么了解兩個更改非常重要:處理不完整的文檔以及具有可修改文本的特殊 HTML 標簽。
文件不完整。
以前,當標簽處理器到達文檔末尾并且存在不完整的標記(例如“ <div cl”)時,它會返回false并完成文檔的解析。現在標簽處理器可以掃描并訪問文檔中的每個標記,但是,它會指示是否遇到了這種情況。當它發生時,它仍然會返回false,但它會返回到令牌的開頭并凍結。在未來的版本中,將可以擴展文檔并繼續處理。現在,如果paused_at_incomplete_token()返回true,那么您可以知道發送到處理器的原始 HTML 可能比收到的更多。
帶有可修改文本的特殊 HTML 標簽。
HTML 處理器正確跟蹤文檔結構,并且是確定元素何時開始和結束的適當方法。許多更簡單的方法對于實際使用來說通??雌饋碜銐蛘_,但在常見情況下這些方法都會失效。雖然標簽處理器比基于正則表達式的方法更容易估計結構,但在跳過 HTML 處理器實現的規則時要小心,因為即使是規范的 HTML 也常常會破壞將 HTML 文本轉換為 DOM 結構的簡單心理模型。
對于那些依賴標簽處理器來估計結構的人來說,行為上的變化可能會破壞您的子類:標簽處理器不再訪問特殊元素組的結束標簽。這些是 SCRIPT、STYLE 和 TITLE 等標簽。進行此更改的原因是這些元素內部不能包含其他標簽。它通常看起來像它們一樣(例如,使用<title>an <img> is plain text</title>),但內部內容被解析為文本而不是 HTML。此更改可防止將這些內部內容誤解為 HTML 標記。
當標簽處理器遇到 SCRIPT 標簽或任何這些特殊元素時,它將繼續解析,直到找到關聯的結束標簽,然后內部內容將作為可修改的文本提供。對于跟蹤文檔深度的算法,它們不僅需要檢查 tag 是否is_void(),還需要檢查它是否是特殊元素,因為結束標簽將不再被單獨訪問。





