Pergunta

Atualmente, estou correndo em um problema onde um elemento está voltando de meu arquivo xml com uma aspa simples nele. Isso está causando xml_parse para dividi-lo em vários pedaços, exemplo: Get Wired, Está contratado! É então enterpreted como 'Get Wired, You' sendo um objeto, o apóstrofo sendo um segundo, e 're contratado!' como um terceiro.

O que eu quero fazer é:

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

Mas que mantém quebra. Posso executar um str_replace no lugar de htmlentities e funciona sem problema, mas não quer com htmlentities.

Todas as idéias?

Update: De acordo com a resposta de JimmyJ abaixo, tentei a seguinte solução sem sorte (FYI há uma resposta ou dois acima do post vinculado que atualizar o código que está ligada diretamente):

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;
        }

Update:. como por questão de tom abaixo, magic quotes é / foi, de fato desligado

Solução: O que eu acabei fazendo para resolver o problema é o seguinte:

Depois de recolher os dados para cada indivíduo artigo / post / etc, eu armazenar os dados para uma matriz que eu uso mais tarde para a saída, em seguida, desmarque as variáveis ??locais utilizados durante a coleta. Eu adicionado num passo que verifica se os dados já está presente, e, se for, eu concatenar-lo para o efeito, em vez de substituir-lo.

Então, se eu acabar com três pedaços (como acima, vamos ficar com 'Get Wired, Está contratado!', Eu, então, ir de fazer

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

Para fazer:

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

Esta não é a melhor solução, mas parece estar funcionando.

Foi útil?

Solução

Por que você não usar algo como simplexml_load_file para analisar o seu arquivo facilmente?

Outras dicas

Eu acho que ter magic quotes habilitado pode atrapalhar xml analisar algumas vezes - é isso permitiu ?. Você pode desativar esta em tempo de execução usando

set_magic_quotes_runtime(0);

Edit: isso pode não ser relevante se a fonte não é POST ou GET, mas eu li no manual do PHP que poderia causar um comportamento estranho de qualquer maneira

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top