重新理解前端HTML篇-DTD到底是什麼?

2021-02-16 初見落塵

    大家好我是落塵,一名新進晉級的菜鳥小編,也是一名前端開發攻城獅,從今天起帶大家重新理解前端,重新學習前端,讓大家有新的理解,每天都會更新些前端知識,如果小主們覺得還可以那就關注一下吧!

我們平時寫 HTML 語言,都習慣把關注點放到各種標籤上,很少去深究它的語法。我想你應該會有模糊的感覺,HTML 這樣的語言,跟 JavaScript 這樣的語言會有一些本質的不同。

實際上,JavaScript 語言我們把它稱為「程式語言」,它最大的特點是圖靈完備的,我們大致可以理解為「包含了表達一切邏輯的能力」。像 HTML 這樣的語言,我們稱為「標記語言(mark up language)」,它是純文本的一種升級,「標記」一詞的概念來自:編輯審稿時使用不同顏色筆所做的「標記」。

在上世紀 80 年代,「富文本」的概念在計算機領域的熱門,猶如如今的「AI」和「區塊鏈」,而 Tim Berners-Lee 當時去設計 HTML,也並非是憑空造出來,他使用了當時已有的一種語言:SGML。

SGML 是一種古老的標記語言,可以追溯到 1969 年 IBM 公司所使用的技術,SGML 十分複雜,嚴格來說,HTML 是 SGML 中規定的一種格式,但是實際的瀏覽器沒有任何一個是通過 SGML 引擎來解析 HTML 的。

今天的 HTML 仍然有 SGML 的不少影子,那麼接下來我們就從 SGML 的一些特性來學習一下 HTML。這裡我最想講的是 SGML 留給 HTML 的重要的遺產:基本語法和 DTD。

基本語法

首先,HTML 作為 SGML 的子集,它遵循 SGML 的基本語法:包括標籤、轉義等。

SGML 還規定了一些特殊的節點類型,在我們之前的 DOM 課程中已經講過幾種節點類型,它們都有與之對應的 HTML 語法,我們這裡複習一下:

這裡我們從語法的角度,再逐個具體了解一下。

標籤語法

標籤語法產生元素,我們從語法的角度講,就用「標籤」這個術語,我們從運行時的角度講,就用「元素」這個術語。

HTML 中,用於描述一個元素的標籤分為開始標籤、結束標籤和自閉合標籤。開始標籤和自閉合標籤中,又可以有屬性。

開始標籤:<tagname>

結束標籤:</tagname>

自閉合標籤:<tagname />

HTML 中開始標籤的標籤名稱只能使用英文字母。

這裡需要重點講一講屬性語法,屬性可以使用單引號、雙引號或者完全不用引號,這三種情況下,需要轉義的部分都不太一樣。

屬性中可以使用文本實體(後文會介紹)來做轉義,屬性中,一定需要轉義的有:

一般來說,靈活運用屬性的形式,是不太用到文本實體轉義的。

文本語法

在 HTML 中,規定了兩種文本語法,一種是普通的文本節點,另一種是 CDATA 文本節點。

文本節點看似是普通的文本,但是,其中有兩種字符是必須做轉義的:< 和 &。

如果我們從某處拷貝了一段文本,裡面包含了大量的 < 和 &,那麼我們就有麻煩了,這時候,就輪到我們的 CDATA 節點出場了。

CDATA 也是一種文本,它存在的意義是語法上的意義:在 CDATA 節點內,不需要考慮多數的轉義情況。

CDATA 內,只有字符組合]]>需要處理,這裡不能使用轉義,只能拆成兩個 CDATA 節點。

注釋語法

HTML 注釋語法以<!--開頭,以-->結尾,注釋的內容非常自由,除了-->都沒有問題。
如果注釋的內容一定要出現 -->,我們可以拆成多個注釋節點。

DTD 語法(文檔類型定義)

SGML 的 DTD 語法十分複雜,但是對 HTML 來說,其實 DTD 的選項是有限的,瀏覽器在解析 DTD 時,把它當做幾種字符串之一,關於 DTD,我在本篇文章的後面會詳細講解。

ProcessingInstruction 語法(處理信息)

ProcessingInstruction 多數情況下,是給機器看的。HTML 中規定了可以有 ProcessingInstruction,但是並沒有規定它的具體內容,所以可以把它視為一種保留的擴展機制。對瀏覽器而言,ProcessingInstruction 的作用類似於注釋。

ProcessingInstruction 包含兩個部分,緊挨著第一個問號後,空格前的部分被稱為「目標」,這個目標一般表示處理 ProcessingInstruction 的程序名。

剩餘部分是它的文本信息,沒有任何格式上的約定,完全由文檔編寫者和處理程序的編寫者約定。

DTD

現在我們來講一下 DTD,DTD 的全稱是 Document Type Defination,也就是文檔類型定義。SGML 用 DTD 來定義每一種文檔類型,HTML 屬於 SGML,在 HTML5 出現之前,HTML 都是使用符合 SGML 規定的 DTD。

如果你是一個上個時代走過來的前端,一定還記得 HTML4.01 有三種 DTD。分別是嚴格模式、過渡模式和 frameset 模式。


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

複製代碼

嚴格模式的 DTD 規定了 HTML4.01 中需要的標籤。


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

複製代碼

過渡模式的 DTD 除了 html4.01,還包含了一些被貶斥的標籤,這些標籤已經不再推薦使用了,但是過渡模式中仍保留了它們。


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

複製代碼

frameset 結構的網頁如今已經很少見到了,它使用 frameset 標籤把幾個網頁組合到一起。

眾所周知,HTML 中允許一些標籤不閉合的用法,實際上這些都是符合 SGML 規定的,並且在 DTD 中規定好了的。但是,一些程式設計師喜歡嚴格遵守 XML 語法,保證標籤閉合性,所以,HTML4.01 又規定了 XHTML 語法,同樣有三個版本:

版本一


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

複製代碼

版本二


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "


http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

複製代碼

版本三


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

複製代碼

其實你看看就知道,這些複雜的 DTD 寫法並沒有什麼實際作用(瀏覽器根本不會用 SGML 引擎解析它們),因此,到了 HTML5,乾脆放棄了 SGML 子集這項堅持,規定了一個簡單的,大家都能記住的 DTD:

複製代碼

但是,HTML5 仍然保留了 HTML 語法和 XHTML 語法。

文本實體

不知道你注意到沒有,HTML4.01 的 DTD 裡包含了一個長得很像是 URL 的東西,其實它是真的可以訪問的——但是 W3C 警告說,禁止任何瀏覽器在解析網頁的時候訪問這個 URL,不然 W3C 的伺服器會被壓垮。我相信很多好奇的前端工程師都把它下載下來打開過。

這是符合 SGML 規範的 DTD,我們前面講過,SGML 的規範十分複雜,所以這裡我並不打算講 SGML(其實我也不會),但是這不妨礙我們了解一下 DTD 的內容。這個 DTD 規定了 HTML 包含了哪些標籤、屬性和文本實體。其中文本實體分布在三個文件中:HTMLsymbol.ent HTMLspecial.ent 和 HTMLlat1.ent。

所謂文本實體定義就是類似以下的代碼:

複製代碼

每一個文本實體由&開頭,由;結束,這屬於基本語法的規定,文本實體可以用#後跟一個十進位數字,表示字符 Unicode 值。除此之外這兩個符號之間的內容,則由 DTD 決定。

我這裡數了一下,HTML4.01 的 DTD 中,共規定了 255 個文本實體,找出這些實體和它們對應的 Unicode 編碼,就作為本次課程的課後小問題吧。

總結

今天的分享中我們講了 HTML 的語法,HTML 語法源自 SGML,我們首先介紹了基本語法,包含了五種節點:標籤(元素)、文本、注釋、文檔類型定義(DTD)和處理信息(ProcessingInstruction)。

之後我們又重點介紹了兩部分內容:DTD 和文本實體。

DTD 在 HTML4.01 和之前都非常的複雜,到了 HTML5,拋棄了 SGML 兼容,變成簡單的<!DOCTYPE html>。

文本實體是 HTML 轉義的重要手段,我們講解了基本用法,HTML4.01 中規定的部分,就留給大家作為課後問題了。

大家好我是落塵,希望我分享的文章大家能夠喜歡,也希望大家多多支持,多多轉發;小主們若是喜歡,就掃碼關注一下我,每天都會給大家分享好的文章;

相關焦點

  • 重新理解前端HTML+CSS篇-div和span不是夠用了嗎?
    大家好我是落塵,一名新進晉級的菜鳥小編,也是一名前端開發攻城獅,從今天起帶大家重新理解前端,重新學習前端,讓大家有新的理解
  • 重新理解前端HTML篇-除了a標籤,還有哪些標籤叫連結?
    大家好我是落塵,一名新進晉級的菜鳥小編,也是一名前端開發攻城獅,從今天起帶大家重新理解前端,重新學習前端,讓大家有新的理解
  • HTML和HTML5之間有什麼區別?
    此語言用於注釋(在計算機注釋中)文本,以便機器可以理解它並相應地操作文本。 大多數標記(例如HTML)語言都是人類可讀的。該語言使用標籤來定義必須對文本進行哪些操作。它用於在網頁上構造和呈現內容。 HTML5是HTML的第五個版本,HTML5中刪除或修改了許多元素。 HTML和HTML5之間的區別是什麼?
  • HTML入門基礎篇
    作為WEB前端系列的第一篇文章,本文從最基礎的HTML來開始介紹,本文針對零基礎的對前端感興趣的同學,保證所有人都能看得懂
  • 超全整理前端開發面試題——HTML篇(2016年)
    前端還是一個年輕的行業,新的行業標準, 框架, 庫都不斷在更新和新增。正如赫門在2015深JS大會上的《前端服務化之路》主題演講中說的一句話:「每18至24個月,前端都會難一倍」,這些變化使前端的能力更加豐富、創造的應用也會更加完美。所以關注各種前端技術,跟上快速變化的節奏,也是身為一個前端程式設計師必備的技能之一。Doctype作用?標準模式與兼容模式各有什麼區別?
  • 你好,談談你對前端路由的理解
    前言好了不裝了,今天我就化身性感面試官在線問大家一個問題,「談談你對前端路由的理解」。看到這個問題,那回答可多了去了。但是換位思考一下,你問候選人這個問題的時候,你想要得到什麼答案?以我個人拙見,我希望候選人能從全局解讀這個問題,大致以下三點。
  • html語言是什麼?前端工程師需要明白什麼?
    ,處理瀏覽器兼容問題其實就是要處理同一html文件在不同瀏覽器顯示不同效果的問題。html從1993年誕生25年以來從當初1.0發展現在5.0(html5),而html5經過近幾年的發展現在已經十分火熱了,現在網頁布局方法基本上都是「div+css」,傳統的table布局現在用的已經很少只有一些特殊功能頁面才會用到table布局比如說調查問卷。下面就為大家介紹「學好html語言需要掌握什麼?前端工程師需要明白什麼?」
  • DTD入門
    library.dtd<!ELEMENT library (book+)><!ELEMENT book (title,author,publisher,price)><!ELEMENT title (<!ELEMENT author (<!
  • 前端硬核面試專題之 HTML 24 問
    前端硬核面試專題1. 前言本文講解前端面試的 HTML 的內容。複習前端面試的知識,是為了鞏固前端的基礎知識,最重要的還是平時的積累!注意:文章的題與題之間用下劃線分隔開,答案僅供參考。筆者技術博客首發地址  GitHub,歡迎關注。2. HTML為什麼利用多個域名來存儲網站資源會更有效 ?
  • 前端面試那些坑之HTML篇
    標準模式與兼容模式各有什麼區別?(1)、<!DOCTYPE>聲明位於位於HTML文檔中的第一行,處於<html> 標籤之前。告知瀏覽器的解析器用什麼文檔標準解析這個文檔。DOCTYPE不存在或格式不正確會導致文檔以兼容模式呈現。
  • 2020 年前端面試複習必讀文章【超三百篇】
    rf=37353035[250]從輸入URL到頁面展示,這中間發生了什麼?: https://time.geekbang.org/column/article/117637[251]前端經典面試題: 從輸入URL到頁面加載發生了什麼?
  • 前端html,css基本知識
    上一篇講到過html和css相當於人的身體和衣服的關係,html的歷史發展百度上可以搜到,這裡簡單了解一下,1989年開發出了世界上第一個Web伺服器與Web客戶端,並將這項發明取名為world wide web,也就是我們現在所說的WWW全球資訊網。HTML也因此誕生。
  • 前端自學之路之HTML入門
    DOCTYPE html><html><head><meta charset="utf-8" /><title>開始學習前端</title></head><body><div>今天是2018-01-21&
  • web前端開發面試題一之(html,css)
    前端還是一個年輕的行業,新的行業標準, 框架, 庫都不斷在更新和新增,正如赫門在2015深JS大會上的《前端服務化之路》主題演講中說的一句話:「每18至24個月,前端都會難一倍」,這些變化使前端的能力更加豐富、創造的應用也會更加完美。所以關注各種前端技術,跟上快速變化的節奏,也是身為一個前端程式設計師必備的技能之一。Doctype作用?標準模式與兼容模式各有什麼區別?
  • 前端程式設計師入門html的4大方法,這兩本神書真心經典!
    前端有三架馬車你一定要學會「駕馭」,HTML+CSS+Javascript。照目前看來,網上各種前端學習資料又多又雜,確實讓不少入門前端的小夥伴不知所措。要選什麼學習資料?如何入門前端開發?0、Come on,來點國外的土特產視頻!
  • 【乾貨】各大網際網路公司前端筆試面試題–HTML,CSS篇
    整理分享出來希望更多的前端er共同進步吧,不僅適用於求職者,對於鞏固複習前端基礎更是大有裨益。而更多的題目是我一路以來收集的,也有往年的,答案不確保一定正確,如有錯誤或有更好的解法,還請斧正。前面幾題是會很基礎,越下越有深度。1.你做的頁面在哪些流覽器測試過?這些瀏覽器的內核分別是什麼?
  • HTML|前端網頁的設計基礎知識
    1、關於html簡介html指的是超文本標記語言,是用來描述網頁的一種語言。且其並未為一種程式語言,而是一種標記語言(一套標記標籤),以此為基礎來描述網頁。2、html標籤html通常被尖括號包圍,例如<html>,以此為一個代碼的開始標籤以及終止標籤。圖 1 基本代碼另外,html標籤通常是成對存在的,比如<p>和</p>,一個為其實標籤,另一個為終止標籤,在兩個字符間的文本被現實為段落。
  • 前端技術及開發模式的演進
    先聲明,本篇不會講帶有年代性的前端發展史,不講故事,想了解的讀者可以去查閱一些其他的資料和文章,本篇僅僅從技術發展角度結合案例分析,說明前端技術的發展和開發模式的演進變化。本篇內容重點說明PC端技術,移動端、桌面端本篇不涉及,防止讀者看到後面有疑惑,這裡強調一下。
  • 6 大主流 Web 框架優缺點對比:15篇前端熱文回看
    《Ajax 跨域,這應該是最全的解決方案了》從剛接觸前端開發起,跨域這個詞就一直以很高的頻率在身邊重複出現,一直到現在,已經調試過N個跨域相關的問題了,16年時也整理過一篇相關文章,但是感覺還是差了點什麼,於是現在重新梳理了一下。《2017 前端大事件和趨勢回顧,2018 何去何從?》2017年,前端開發繼續飛速發展。
  • 從零開始學習web前端技術路線圖
    大學四年什麼都沒學到,之前也沒考慮未來工作方向,到快要畢業了,迷茫,不知道能做什麼。我給他的答案是:這個培訓,並不是交了錢,知識就灌到腦子裡的,你沒有基礎,沒有學習能力,沒有狠勁,可能學了四個月跟現在水平差不了太多。最後,建議考研,或者學一下前端技術。