gpt4 book ai didi

PHP 没有用于 XML 安全实体解码的函数吗?没有一些 xml_entity_decode?

转载 作者:可可西里 更新时间:2023-11-01 14:03:12 26 4
gpt4 key购买 nike

问题:我需要一个由 UTF8“完全编码”的 XML 文件;也就是说,没有表示符号的实体,所有符号都由 UTF8 编码,除了唯一的 3 个 XML 保留的符号,“&”(amp)、“<”(lt) 和“>”(gt)。而且,我需要一个内置函数来快速完成:将实体转换为真正的 UTF8 字符(不会破坏我的 XML)。
PS:这是一个“现实世界的问题”(!);在PMC/journals ,例如,有 280 万篇科学文章以 a special XML DTD 结尾(也称为 JATS format )...要处理为“普通 XML-UTF8 文本”,我们需要将数字实体更改为 UTF8 字符。

尝试的解决方案:此任务的自然函数是 html_entity_decode , 但它破坏了 XML 代码 (!), 转换保留的 3 个 XML 保留符号。

说明问题

假设

  $xmlFrag ='<p>Hello world! &#160;&#160; Let A&lt;B and A=&#x222C;dxdy</p>';

其中实体 160 (nbsp) 和 x222C(双整数)必须转换为 UTF8,并且 XML 保留 lt不是。 XML 文本将是(转换后),

$xmlFrag = ' <p> Hello World !让 A &lt; B 和 A=∬dxdy </p> ';

文本“A A&lt;B .


受挫的解决方案

我尝试使用 html_entity_decode为了解决(直接!)问题...所以,我将 PHP 更新到 v5.5 以尝试使用 ENT_XML1选项,

  $s = html_entity_decode($xmlFrag, ENT_XML1, 'UTF-8'); // not working
// as I expected

也许另一个问题是,“为什么没有其他选项来执行我期望的操作?”——这对许多其他 XML 应用程序(!)来说很重要,不仅对我而言。 p>


我不需要解决方法作为答案...好吧,我展示了我丑陋的功能,也许它可以帮助您理解问题,

  function xml_entity_decode($s) {
// here an illustration (by user-defined function)
// about how the hypothetical PHP-build-in-function MUST work
static $XENTITIES = array('&amp;','&gt;','&lt;');
static $XSAFENTITIES = array('#_x_amp#;','#_x_gt#;','#_x_lt#;');
$s = str_replace($XENTITIES,$XSAFENTITIES,$s);

//$s = html_entity_decode($s, ENT_NOQUOTES, 'UTF-8'); // any php version
$s = html_entity_decode($s, ENT_HTML5|ENT_NOQUOTES, 'UTF-8'); // PHP 5.3+

$s = str_replace($XSAFENTITIES,$XENTITIES,$s);
return $s;
} // you see? not need a benchmark:
// it is not so fast as direct use of html_entity_decode; if there
// was an XML-safe option was ideal.

PS:在 this answer 之后更正.必须是 ENT_HTML5标志,用于转换 really all named entities .

最佳答案

这个问题会一次又一次地产生“错误答案”(参见答案)。这可能是因为人们没有注意,也因为没有答案:缺少PHP内置解决方案

...所以,让我们重复我的解决方法(不是答案!),以免造成更多困惑:

最佳解决方法

注意:

  1. 下面的函数 xml_entity_decode() 是最好的(超过任何其他)解决方法
  2. 下面的函数不是对present question 的回答。 , 这只是一个解决方法。
  function xml_entity_decode($s) {
// illustrating how a (hypothetical) PHP-build-in-function MUST work
static $XENTITIES = array('&amp;','&gt;','&lt;');
static $XSAFENTITIES = array('#_x_amp#;','#_x_gt#;','#_x_lt#;');
$s = str_replace($XENTITIES,$XSAFENTITIES,$s);
$s = html_entity_decode($s, ENT_HTML5|ENT_NOQUOTES, 'UTF-8'); // PHP 5.3+
$s = str_replace($XSAFENTITIES,$XENTITIES,$s);
return $s;
}

为了测试并证明您有更好的解决方案,请先使用这个简单的基准测试:

  $countBchMk_MAX=1000;
$xml = file_get_contents('sample1.xml'); // BIG and complex XML string
$start_time = microtime(TRUE);
for($countBchMk=0; $countBchMk<$countBchMk_MAX; $countBchMk++){

$A = xml_entity_decode($xml); // 0.0002

/* 0.0014
$doc = new DOMDocument;
$doc->loadXML($xml, LIBXML_DTDLOAD | LIBXML_NOENT);
$doc->encoding = 'UTF-8';
$A = $doc->saveXML();
*/

}
$end_time = microtime(TRUE);
echo "\n<h1>END $countBchMk_MAX BENCKMARKs WITH ",
($end_time - $start_time)/$countBchMk_MAX,
" seconds</h1>";

关于PHP 没有用于 XML 安全实体解码的函数吗?没有一些 xml_entity_decode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18039765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com