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

因此,如果我的意见是Judge-Fürstová Mila 和 Judge-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 回答