php html 轉xml,用PHP生成XML文檔(轉義字符)

用PHP生成XML文檔(轉義字符)

我正在從PHP腳本生成XML文檔,并且需要轉義XML特殊字符。我知道應該轉義的字符列表; 但是正確的方法是什么?

應該使用反斜杠(\')來轉義字符還是正確的方法?有內置的PHP函數可以為我處理此問題嗎?

Tomas Jancik asked 2020-06-22T22:40:59Z

10個解決方案

36 votes

我創建了一個簡單的函數,該函數使用XML中的五個“預定義實體”進行轉義:

function xml_entities($string) {

return strtr(

$string,

array(

" "<",

">" => ">",

'"' => """,

"'" => "'",

"&" => "&",

)

);

}

用法示例演示:

$text = "Test & and encode :)";

echo xml_entities($text);

輸出:

Test &amp; <b> and encode </b> :)

通過使用str_replace可以達到類似的效果,但是由于兩次替換(未試用,不建議使用),它很脆弱:

function xml_entities($string) {

return str_replace(

array("&", "", '"', "'"),

array("&", "<", ">", """, "'"),

$string

);

}

Tomas Jancik answered 2020-06-22T22:42:07Z

34 votes

使用DOM類生成整個XML文檔。 它將處理我們甚至不需要關心的編碼和解碼。

編輯:這被@Tchalvak批評:

DOM對象創建了一個完整的XML文檔,它不容易將其自身編碼為一個字符串。

錯了,DOMDocument只能輸出一個片段而不是整個文檔:

$doc->saveXML($fragment);

這使:

Test & and encode :)

Test &amp; <b> and encode </b> :)

如:

$doc = new DOMDocument();

$fragment = $doc->createDocumentFragment();

// adding XML verbatim:

$xml = "Test & and encode :)\n";

$fragment->appendXML($xml);

// adding text:

$text = $xml;

$fragment->appendChild($doc->createTextNode($text));

// output the result

echo $doc->saveXML($fragment);

觀看演示

Ionu? G. Stan answered 2020-06-22T22:41:33Z

17 votes

那get_html_translation_table()函數呢?

htmlspecialchars($input, ENT_QUOTES | ENT_XML1, $encoding);

注意:僅當您具有PHP 5.4.0或更高版本時,get_html_translation_table()標志才可用。

使用這些參數的get_html_translation_table()替換了以下字符:

get_html_translation_table()(與號)變成>

get_html_translation_table()(雙引號)變成>

get_html_translation_table()(單引號)變為>

get_html_translation_table()(小于)變成>

get_html_translation_table()(大于)變為>

您可以使用get_html_translation_table()函數獲取翻譯表。

MarcDefiant answered 2020-06-22T22:43:02Z

13 votes

嘗試解決XML實體問題,以這種方式解決:

htmlspecialchars($value, ENT_QUOTES, 'UTF-8')

Josh Sunderman answered 2020-06-22T22:43:22Z

5 votes

為了擁有有效的最終XML文本,您需要轉義所有XML實體,并以與XML文檔處理指令所聲明的格式相同的編碼來編寫文本(<?xml行中的 “編碼”)。 只要將重音字符編碼為文檔,就不必對其進行轉義。

但是,在許多情況下,僅用iconv()轉義輸入可能會導致對實體進行雙重編碼(例如utf8_encode()將變為&eacute;),因此我建議先對html實體進行解碼:

function xml_escape($s)

{

$s = html_entity_decode($s, ENT_QUOTES, 'UTF-8');

$s = htmlspecialchars($s, ENT_QUOTES, 'UTF-8', false);

return $s;

}

現在,您需要確保所有重音字符在XML文檔編碼中均有效。 我強烈建議始終以UTF-8編碼XML輸出,因為并非所有XML解析器都遵循XML文檔處理指令編碼。 如果您的輸入可能來自其他字符集,請嘗試使用iconv()。

有一種特殊情況,即您的輸入可能來自以下一種編碼:ISO-8859-1,ISO-8859-15,UTF-8,cp866,cp1251,cp1252和KOI8-R-PHP會將它們全部 相同,但是它們之間存在一些細微差異-甚至iconv()也無法處理其中的某些差異。 我只能通過補充utf8_encode()行為來解決此編碼問題:

function encode_utf8($s)

{

$cp1252_map = array(

"\xc2\x80" => "\xe2\x82\xac",

"\xc2\x82" => "\xe2\x80\x9a",

"\xc2\x83" => "\xc6\x92",

"\xc2\x84" => "\xe2\x80\x9e",

"\xc2\x85" => "\xe2\x80\xa6",

"\xc2\x86" => "\xe2\x80\xa0",

"\xc2\x87" => "\xe2\x80\xa1",

"\xc2\x88" => "\xcb\x86",

"\xc2\x89" => "\xe2\x80\xb0",

"\xc2\x8a" => "\xc5\xa0",

"\xc2\x8b" => "\xe2\x80\xb9",

"\xc2\x8c" => "\xc5\x92",

"\xc2\x8e" => "\xc5\xbd",

"\xc2\x91" => "\xe2\x80\x98",

"\xc2\x92" => "\xe2\x80\x99",

"\xc2\x93" => "\xe2\x80\x9c",

"\xc2\x94" => "\xe2\x80\x9d",

"\xc2\x95" => "\xe2\x80\xa2",

"\xc2\x96" => "\xe2\x80\x93",

"\xc2\x97" => "\xe2\x80\x94",

"\xc2\x98" => "\xcb\x9c",

"\xc2\x99" => "\xe2\x84\xa2",

"\xc2\x9a" => "\xc5\xa1",

"\xc2\x9b" => "\xe2\x80\xba",

"\xc2\x9c" => "\xc5\x93",

"\xc2\x9e" => "\xc5\xbe",

"\xc2\x9f" => "\xc5\xb8"

);

$s=strtr(utf8_encode($s), $cp1252_map);

return $s;

}

Capilé answered 2020-06-22T22:43:56Z

2 votes

如果您需要正確的xml輸出,則可以使用simplexml:

[HTTP://嗚嗚嗚.PHP.net/manual/恩/simple XML element.as XML.PHP]

nubeiro answered 2020-06-22T22:44:21Z

1 votes

正確的轉義是獲得正確的XML輸出的方法,但是您需要對屬性和元素進行不同的轉義處理。 (那是Tomas的回答是不正確的)。

我寫/偷了一些Java代碼,以區分屬性和元素轉義。 原因是XML解析器認為所有空白特別是屬性中的空白。

將其移植到PHP上應該很簡單(您可以使用Tomas Jancik的方法進行上述適當的轉義)。 如果您使用UTF-8,則不必擔心轉義擴展實體。

如果您不想移植我的Java代碼,可以查看XMLWriter,它基于流并且使用libxml,因此它應該非常有效。

Adam Gent answered 2020-06-22T22:44:55Z

0 votes

您可以使用以下方法:[http://php.net/manual/en/function.htmlentities.php]

這樣,所有實體(html / xml)均被轉義,您可以將字符串放入XML標簽內

Alois Cochard answered 2020-06-22T22:45:19Z

-1 votes

基于sadeghj的解決方案,以下代碼為我工作:

/**

* @param $arr1 the single string that shall be masked

* @return the resulting string with the masked characters

*/

function replace_char($arr1)

{

if (strpos ($arr1,'&')!== FALSE) { //test if the character appears

$arr1=preg_replace('/&/','&', $arr1); // do this first

}

// just encode the

if (strpos ($arr1,'>')!== FALSE) {

$arr1=preg_replace('/>/','>', $arr1);

}

if (strpos ($arr1,'

$arr1=preg_replace('/','<', $arr1);

}

if (strpos ($arr1,'"')!== FALSE) {

$arr1=preg_replace('/"/','"', $arr1);

}

if (strpos ($arr1,'\'')!== FALSE) {

$arr1=preg_replace('/\'/',''', $arr1);

}

return $arr1;

}

paderEpiktet answered 2020-06-22T22:45:39Z

-2 votes

function replace_char($arr1)

{

$arr[]=preg_replace('>','&gt', $arr1);

$arr[]=preg_replace('

$arr[]=preg_replace('"','&quot', $arr1);

$arr[]=preg_replace('\'','&apos', $arr1);

$arr[]=preg_replace('&','&amp', $arr1);

return $arr;

}

sadeghj answered 2020-06-22T22:45:54Z

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281472.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281472.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281472.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【例題 8-13 UVA - 11093】Just Finish it up

【鏈接】 我是鏈接,點我呀:) 【題意】 在這里輸入題意 【題解】 尺取法。 假設現在取[l..r]這一段。 然后發現累加的和小于0了。 那么方法只能是不走l..l1這一段了 即delta遞減(p[l]-q[l]); 直到delta>0為止。 某個時刻如果發現r1l 或者l1且rn 則合法。 如果發現l大于n了.…

springboot配置允許跨域訪問

2019獨角獸企業重金招聘Python工程師標準>>> 因springboot框架通常用于前后端分離項目&#xff0c;因此需配置后臺允許跨域訪問&#xff08;具體看注釋&#xff09;&#xff0c;配置類如下&#xff0c;將該類加入工程中即可。 import org.springframework.context.a…

機器視覺傳感器選型,交互作用決定取舍

目前&#xff0c;如何選擇機器視覺傳感器在當代的應用可謂是越來越廣泛&#xff0c;如何選擇機器視覺傳感器是值得我們好好學習的&#xff0c;現在我們就深入了解如何選擇機器視覺傳感器。 相機是機器視覺系統的眼睛&#xff0c;而相機的心臟是圖像傳感器。傳感器的選擇取決于準…

大連交通大學計算機網絡,計算機網絡題庫(大連交通大學)chapter5.doc

計算機網絡題庫(大連交通大學)chapter5Chapter 5 The Link Layer and Local Area Network1&#xff0e;A ( ) protocol is used to move a datagram over an individual link.Aapplication-layerBtransport-layerCnetwork-layerDlink-layer2&#xff0e;The units of data exch…

使用qrcode類制作二維碼

<?phprequire_once ./phpqrcode/phpqrcode.php;/** 地址:http://phpqrcode.sourceforge.net/ 下載qrcode類* param string $url 要生成的鏈接* param bool $local 是否生成本地文件 * param string $logo 中間圖片地址 */ echo qrcode(https://www.cnblogs.co…

《Hadoop大明白》【1】Hadoop的核心組件

為什么80%的碼農都做不了架構師&#xff1f;>>> 本書適用于想對大數據平臺Hadoop有深入了解的程序員朋友&#xff0c;會幫助你以后在應用開發方面趟平一些坑。 1&#xff0c;Hadoop 是一個系列大數據組件構成的應用平臺&#xff0c;可由多個廉價機器搭建集群&#…

計算機專業學教育技術優勢,西南交通大學教育技術學(040110)專業介紹

一、學科概況“教育技術學”是教育學一級學科下的一個二級學科&#xff0c;教育技術學是教育學和計算機信息技術發展下新興的跨專業交叉性學科&#xff0c;也是一個理論與實踐相結合的應用學科。主要研究信息技術特別是計算機網絡技術、多媒體技術與教育技術的有效整合&#xf…

.NET7是如何優化Guid.Equals性能的?

簡介在之前的文章中&#xff0c;我們多次提到 Vector - SIMD 技術&#xff0c;也答應大家在后面分享更多.NET7 中優化的例子&#xff0c;今天就帶來一個使用 SIMD 優化Guid.Equals()方法性能的例子。為什么 Guid 能使用 SIMD 優化&#xff1f;首先就需要介紹一些背景知識&#…

go語言載入json的一個坑

問題簡介 go語言標準庫匯總內置了對 json 文件的處理&#xff0c;非常方便&#xff0c;最近在寫一個應用的時候&#xff0c;需要從 json 文件中載入 配置&#xff0c;由于是 go 新手&#xff0c;忽略一個細節&#xff0c;導致載入內容始終為空 代碼演示 代碼是最好的說明載體 p…

el表達式 if 和 if else 的寫法

javaScript的if else大家都不會陌生&#xff0c;但可能很多小伙伴并不知道在jsp文件里&#xff0c;el表達式的if else是怎么寫的&#xff0c;下面安利給各位小伙伴。 el表達式 if 代碼示例示例1<c:if test"${jsonObject.transportTypeName eq 火車}"><li>…

Effective_STL 學習筆記(二十七) 用 distance 和 advance 把 const_iterator 轉化成 iterator...

并不存在從 const_iterator 到 iterator 之間的隱式轉換 一種安全的、可移植的方法獲取他所對應的 iterator&#xff1a; 1   typedef deque<int> IntDeque;     // 方便的typedef 2   typedef IntDeque::iterator Iter; 3   typedef IntDeque::const_iterato…

分布式唯一Id

支持.Net/.Net Core/.Net Framework&#xff0c;可以部署在Docker, Windows, Linux, Mac。分布式唯一Id&#xff0c;顧名思義&#xff0c;是指在全世界任何一臺計算機上都不會重復的唯一Id。在單機/單服務器/單數據庫的小型應用中&#xff0c;不需要用到這類東西。但在高并發、…

缺氧游戲黑科技計算機,《缺氧》游戲內參數修改圖文詳解

很多玩家都很喜歡缺氧這款游戲&#xff0c;有時候因為一些不可告人的秘密我們需要修改游戲中的內容來達到簡化我們的生存難度&#xff0c;這樣就需要修改游戲的腳本&#xff0c;所幸《缺氧 》對于這個問題很寬容&#xff0c;完全沒有加密地圖的生成腳本&#xff0c;讓我們可以完…

Python 項目實踐三(Web應用程序)第四篇

接著上節繼續學習&#xff0c;本章將建立用戶賬戶 Web應用程序的核心是讓任何用戶都能夠注冊賬戶并能夠使用它&#xff0c;不管用戶身處何方。在本章中&#xff0c;你將創建一些表單&#xff0c;讓用戶能夠添加主題和條目&#xff0c;以及編輯既有的條目。你還將學習Django如何…

新手想買二手車 先看看買車后這五個步驟吧

買二手車你該知道 很多人因為資金短缺又或者是想要一輛便宜車“練手”而選擇去買一輛價格低廉&#xff0c;有著一定車齡的二手車。很多人看中二手車正正是因為便宜&#xff0c;以為是購買以后基本不需要再投入新的花費&#xff0c;殊不知這是非常錯誤的想法&#xff0c;因為以下…

yii---where or該如何使用

今天調試YII項目的時候&#xff0c;遇到一個奇葩的事兒&#xff0c;在調試 where or 查詢的時候&#xff1a;調試語句是這樣&#xff1a; $str static::find()->where([or,username > $username,mobile > $account]); echo "<br>"; echo $st…

十六進制編輯器--ImHex

十六進制編輯器是用于編輯單個字節數據的軟件應用程序&#xff0c;主要由程序員或系統管理員使用。常規文本編輯器和十六進制編輯器之間的區別在于常規編輯器表示文件的邏輯內容&#xff0c;而十六進制編輯器表示文件的物理內容。十六進制編輯器可以讓你以十六進制的形式查看或…

計算機第一課 教案 紀律,信息技術開學第一課-紀律

《信息技術開學第一課-紀律》由會員分享&#xff0c;可在線閱讀&#xff0c;更多相關《信息技術開學第一課-紀律(3頁珍藏版)》請在人人文庫網上搜索。1、信息技術開學第一課教學目標&#xff1a;1、 了解學生的基礎情況&#xff0c;選出課代表2、 分好學習小組&#xff0c;選出…

奧迪堅SVRM(Screen-Voice Recording Manager)錄屏軟件正式發布

奧迪堅SVRM(Screen-Voice Recording Manager)能夠對座席通話同步錄音的同時進行座席操作錄屏 實時監控座席屏幕操作&#xff0c;及時糾正操作問題。 座席質檢可以邊聽邊看&#xff0c;為KPI考核提供依據。 利用優秀座席操作記錄對座席進行培訓。 監控坐席人員對敏感信息訪問次數…

小米:開源不僅要站在巨人的肩膀上,還要為巨人指方向

今天上午&#xff0c;第一屆小米開源技術峰會在北京舉行&#xff0c;會上&#xff0c;小米人工智能與云平臺副總裁崔寶秋致開場詞&#xff0c;并發表了《小米開源之路》的演講。 崔寶秋強調小米一直在推動開源&#xff0c;也是開源的倡導者。他告訴我們雷軍創立小米的其中一個重…