我目前正在嘗試提供XHTML5.目前,我在正在處理的頁面上提供XHTML 1.1 Strict.那就是我為有能力的瀏覽器所做的.對于那些不接受XML編碼數據的人,我會嚴格遵循HTML4.1.
在嘗試使用HTML5進行試驗時,以HTML5格式交付時,所有功能或多或少都可以按預期工作.但是,作為XHTML5交付時,我遇到的第一個問題是HTML實體. FF4 sais& uuml;是未定義的實體.因為沒有HTML5 DTD.
我了解到HTML5 wiki當前建議:
Do not use entity references in XHTML (except for the 5 predefined entities: &, <, >, " and ')
我確實需要& lt;& gt;在某些地方.因此,我的問題是,用PHP解碼除上述五個實體之外的所有實體的最佳方法是什么. html_entity_decode()對其全部進行解碼,因此是否有合理的方法排除某些內容?
更新:
目前,我采用了一種簡單的替換/替換返回方法,因此,除非真的有一種優雅的方法,否則這個問題就足以解決我的迫切需求.
function non_html5_entity_decode($string)
{
$string = str_replace("&",'@@@AMP',
str_replace("'",'@@@APOS',
str_replace("<",'@@@LT',
str_replace(">",'@@@GT',
str_replace(""",'@@@QUOT',$string)))));
$string = html_entity_decode($string);
$string = str_replace('@@@AMP',"&",
str_replace('@@@APOS',"'",
str_replace('@@@LT',"<",
str_replace('@@@GT',">",
str_replace('@@@QUOT',""",$string)))));
return $string;
}
解決方法:
通用轉換時要特別注意:使用帶有默認參數的html_entity_decode不會刪除all named entities,只有少數由舊的HTML 4.01標準定義.因此,& copy;(?)之類的實體將被轉換;但有些人喜歡& plus((& plus;)).要轉換所有命名的實體,請在第二個參數(!)中使用ENT_HTML5.
此外,如果目標編碼不是UTF8,則無法接收上級(至255個)名稱,例如& Ascr;(& Ascr;)則為119964> 255.
因此,要轉換“所有可能的命名實體”,您必須使用html_entity_decode($s,ENT_HTML5,’UTF-8′),但僅對PHP5.3有效,該標志實現了ENT_HTML5.
在此問題的特定情況下,還必須使用標志ENT_NOQUOTES代替默認的ENT_COMPAT,因此,必須使用html_entity_decode($s,ENT_HTML5 | ENT_NOQUOTES,’UTF-8′)
PS(編輯):感謝@BoltClock記住有關PHP5.3的知識.
標簽:html5,php
來源: https://codeday.me/bug/20191208/2090196.html