0

我目前遇到一个问题,其中一个元素从我的 xml 文件中返回,其中包含一个单引号。这导致 xml_parse 将其分成多个块,例如:Get Wired, You're Hired!然后输入为“Get Wired, You”是一个对象,单引号是第二个,“re Hired!” 作为第三者。

我想做的是:

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("$0")', $string);
        return $string;
    }

    function _privateXMLEntities($num)
    {
    $chars = array(
        39  => ''',
        128 => '€',
        130 => '‚',
        131 => 'ƒ',
        132 => '„',
        133 => '…',
        134 => '†',
        135 => '‡',
        136 => 'ˆ',
        137 => '‰',
        138 => 'Š',
        139 => '‹',
        140 => 'Œ',
        142 => 'Ž',
        145 => '‘',
        146 => '’',
        147 => '“',
        148 => '”',
        149 => '•',
        150 => '–',
        151 => '—',
        152 => '˜',
        153 => '™',
        154 => 'š',
        155 => '›',
        156 => 'œ',
        158 => 'ž',
        159 => 'Ÿ');
        $num = ord($num);
        return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" );
    }
if(!xml_parse($xml_parser, XMLEntities($data), feof($fp))) {
            break;
        }

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

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

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

所以,如果我最终得到三个块(如上,让我们坚持'Get Wired,You're Hired!',然后我将不再做

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

要做:

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

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

4

2 回答 2

2

我认为启用魔术引号有时会弄乱 xml 解析 - 这是否启用?您可以在运行时使用禁用此功能

set_magic_quotes_runtime(0);

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

于 2008-09-30T14:54:01.403 回答
1

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

于 2008-09-30T15:03:05.253 回答