2

以前に解決されたこの質問の後で、特殊文字や二重引用符などに別の問題があるようです。

以前は、「&」などの記号をXMLの数値コードに変換するこの関数を使用していました。

function convert_specialchars_to_xmlenties($string) 
{ 

    # in order to convert  <, >, &, ' and ", include them into the square brackes [<\'"&>\x80-\xff]
    $output = preg_replace('/([<\'"&>\x80-\xff])/e', "'&#' . ord('$1') . ';'", $string);

    # return the result
    return $output; 
}

だから私の入力が裁判官-FürstováMila&裁判官-FürstováMilaの場合

私は取得しますJudge-F&#252;rstov&#225; Mila &#38; Judge-F&#252;rstov&#225; Mila

しかし、私はPDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"すべての特殊文字を処理するために使用しているので、私の入力が次のようなものである場合

裁判官-FürstováMila&裁判官-FürstováMila

今戻ってきます、

Judge-F&#195;&#188;rstov&#195;&#161; Mila &#38; Judge-F&#195;&#188;rstov&#195;&#161; Mila

これはXMLでは正しくないと思います。

したがって、<、>、&、'および"のみを変換する必要があると思いますが、 üáなどの他の特殊文字は変換しないでください。

どうすればこれができるのか、何かアイデアはありますか?または、問題を誤って考え/理解したことがあり、この問題を解決するための他のより良い方法がありますか?

編集:

<、>、&、'と"だけを変換する関数を変更しただけなので、間違っていました。

$output = preg_replace('/([<\'"&>])/e', "'&#' . ord('$1') . ';'", $string);

XMLはまだ以下の変換されたコードを受け入れません、

Judge-Fürstová Mila &#38; Judge-Fürstová Mila

私はそれがそれをする他の理由を考えることができません!何か案は?

4

2 に答える 2

3

htmlspecialchars()が必要です。名前があなたを失望させないでください。デフォルトでは、リストした文字のみを変換します。

于 2012-04-19T18:37:54.720 に答える
-1

余分なものをすべて切り取り、実際の回答を保持するように回答を編集しました

が必要mb_ereg_replace_callbackで、コールバックはマルチバイト文字を処理する必要があります。何かのようなもの:

$out = mb_ereg_replace_callback(
    "[<>&\"']",
    function($a) {
        $o = 0;
        $l = strlen($a[0]);
        for( $i=0; $i<$l; $i++) {
            $o = ($o << 8) | ord($a[$i]);
        }
        return "&#".$o.";";
    },
    $in);

この場合、コールバックは単純なもので問題ordありませんが、いつか他の文字にこのコードを再利用したい場合があります。

于 2012-04-19T18:43:50.473 に答える