9

-時々-失敗し(ロードするデータによって異なります)、次のようなエラーが発生するphpアプリケーションがあります。

parser error : PCDATA invalid Char value 11
Warning: simplexml_load_file(): ath>/datadrivenbestpractices/Data-driven Best Practices in 
Warning: simplexml_load_file(): ^ in 

問題を引き起こしている値がいくつかあることは確かです。私はデータを制御できません。エラー:「入力が適切な UTF-8 ではありません。エンコーディングを指定してください!PHP の simplexml_load_stringとsimplexmlで無効な Unicode を処理する方法とPHP を使用して XML ファイル内の無効な文字をスキップする方法を使用しますが、役に立ちませんでした。

原因となる文字列は次のとおりです。「Data Driven - Best Practices」および「Data-driven Best Practices to Recruit and Retain Underrepresented Graduate Students May 12, 2011 - 1:30-3:00 pm, EST」(ダッシュまたは改行文字の場合があります) .

私に何ができる?私の環境は Windows php テスト環境ですが、ライブ環境は LAMP になります。.ini ファイルに触れることはできません。

ありがとう。

4

2 に答える 2

16

解析する前に無効な文字を削除するのが最も簡単な修正です。

function utf8_for_xml($string)
{
    return preg_replace ('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $string);
}

From: PHP で生成された XML に無効な Char 値 27 メッセージが表示される

于 2013-01-22T17:04:26.923 に答える
0

気にしないでください。PHPを使用して XML ファイル内の無効な文字をスキップする方法 はうまくいきました。これが私のコードです:

stream_filter_register('xmlutf8', 'ValidUTF8XMLFilter');

class ValidUTF8XMLFilter extends php_user_filter
{
    protected static $pattern = '/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u';

    function filter($in, $out, &$consumed, $closing)
    {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = preg_replace(self::$pattern, '', $bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

$doc = simplexml_load_file("php://filter/read=xmlutf8/resource=".$serveraddress.$myparam);
于 2013-01-22T18:11:53.683 に答える