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.mzph.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;也是开源的倡导者。他告诉我们雷军创立小米的其中一个重…