如何反序列化XML字符串并正确还原NCR且不破坏URL参数?
解决XML字符串中数字字符引用还原与URL实体保留的问题
我来帮你搞定这个棘手的问题——既要还原那些被双重转义的数字字符引用(比如¥),又不能破坏URL里的实体导致链接失效。
核心问题分析
你的XML字符串里存在两种不同的实体:
- 需要还原的数字字符引用:比如
¥其实是¥被转义了两次(¥→¥→¥→¥),直接用simplexml_load_string解析的话,只会得到¥而不是¥。 - URL中的合法实体:比如
https://testURL.com?param1=a&param2=b里的&对应URL原生的&,如果用html_entity_decode全量处理,会把这些实体也转成&,导致XML解析器认为这是未闭合的实体,直接报错或者让URL失效。
精准解决方案:正则定向替换
我们可以用正则表达式精准匹配并替换那些被双重转义的数字字符引用,完全不碰URL里的实体。具体步骤如下:
- 用正则匹配所有
&#([xX]?[0-9a-fA-F]+);格式的内容(也就是双重转义的数字/十六进制字符引用)。 - 将其替换为
&#$1;,还原成XML能直接识别的单层字符引用。 - 再用
simplexml_load_string解析处理后的XML字符串,此时数字引用会被正确还原,URL里的实体也能保持合法状态。
PHP代码示例
// 你的原始XML字符串 $rawXml = '<root> <price>&amp;#xA5;100</price> <link>https://testURL.com?param1=a&amp;param2=b</link> </root>'; // 定向替换双重转义的数字字符引用 $processedXml = preg_replace('/&amp;#([xX]?[0-9a-fA-F]+);/', '&#$1;', $rawXml); // 解析XML $xmlObject = simplexml_load_string($processedXml); // 验证结果 echo $xmlObject->price; // 输出:¥100 echo "\n"; echo $xmlObject->link; // 输出:https://testURL.com?param1=a¶m2=b
为什么这个方法可行?
- 正则表达式只针对
&amp;#开头、;结尾的数字字符引用,不会影响URL中独立的&amp;。 - 还原后的
&#xXX;格式会被XML解析器自动转换成对应的字符,而URL里的&amp;会被解析成&,正好是URL需要的合法格式。
如果你用DOMDocument解析XML,也可以基于同样的思路先处理字符串,再解析,效果是一致的。
内容的提问来源于stack exchange,提问作者learning_13
相关产品推荐
相关产品推荐

