我目前遇到一个问题,其中一个元素从我的xml文件返回,其中包含一个引号。这导致xml_parse将其分解为多个块,例如:获取有线,你被雇用了! 然后输入为'Get Wired,You'是一个对象,单引号是第二个,并且'被雇用了!'作为第三个。

我想做的是:

while($data = fread($fp, 4096)){
        if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) {
            break;
        }
    }

但这一直在打破。我可以运行一个str_replace来代替htmlentities,它可以毫无问题地运行,但不想使用htmlentities。

有什么想法吗?

<强>更新 根据JimmyJ在下面的回复,我尝试了以下解决方案但没有运气(仅供参考,或者在链接帖子上方有两个响应更新直接链接的代码):

function XMLEntities($string)
    {
        $string = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '_privateXMLEntities("
$x = 'Get Wired, You'
$x = "'"
$x = 're Hired!'
")', $string); return $string; } function _privateXMLEntities($num) { $chars = array( 39 => '&#39;', 128 => '&#8364;', 130 => '&#8218;', 131 => '&#402;', 132 => '&#8222;', 133 => '&#8230;', 134 => '&#8224;', 135 => '&#8225;', 136 => '&#710;', 137 => '&#8240;', 138 => '&#352;', 139 => '&#8249;', 140 => '&#338;', 142 => '&#381;', 145 => '&#8216;', 146 => '&#8217;', 147 => '&#8220;', 148 => '&#8221;', 149 => '&#8226;', 150 => '&#8211;', 151 => '&#8212;', 152 => '&#732;', 153 => '&#8482;', 154 => '&#353;', 155 => '&#8250;', 156 => '&#339;', 158 => '&#382;', 159 => '&#376;'); $num = ord($num); return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" ); } if(!xml_parse($xml_parser, XMLEntities($data), feof($fp))) { break; }

更新:根据下面的汤姆问题,魔法引号确实已关闭。

解决方案:我最终解决问题的方法如下:

收集每个单独项目/帖子/等的数据后,我将该数据存储到我稍后用于输出的数组中,然后清除收集期间使用的局部变量。我添加了一个步骤,检查数据是否已经存在,如果是,我将它连接到最后,而不是覆盖它。

所以,如果我最终得到三个块(如上所述,让我们坚持'获取有线,你被雇用了!',我将继续做下去

$x = 'Get Wired, You' . "'" . 're Hired!'

要做:

<*>

这不是最佳解决方案,但似乎有效。

有帮助吗?

解决方案

为什么不使用simplexml_load_file之类的东西来轻松解析文件?

其他提示

我认为启用魔术引号有时会搞乱xml解析 - 这是启用吗?您可以使用

在运行时禁用它
set_magic_quotes_runtime(0);

编辑:如果源不是post或get,这可能不相关,但我在PHP手册中读到它可能会导致奇怪的行为

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top