将PHP中的特殊字符转换为HTML实体

4

我有一个字符串 ex:

$a = 'abcabc';

“小蓝钻石”的表示方式是:bin2hex('') => f09f94b9

小蓝钻石的表示方式

因此,我想将 $a 字符串转换为用 HTML 转义表示的小蓝钻石的字符串:🔹

请问我应该调用哪个函数将所有 Unicode 字符转换为 HTML 转义表示?

更多关于这个案例的细节

在 WordPress 中,当我想将 $a 变量插入表格时,$wpdb 进行检查。 链接到 WPDB 源代码

当 WordPress 准备应该插入或更新的 $data 时,它会在 $wpdb->strip_invalid_text 方法上运行字段,然后检查 $data 中是否有任何无效内容。如果 $a 变量中的文本与以下正则表达式不匹配,则视为无效内容:

                $regex = '/
                (
                    (?: [\x00-\x7F]                  # single-byte sequences   0xxxxxxx
                    |   [\xC2-\xDF][\x80-\xBF]       # double-byte sequences   110xxxxx 10xxxxxx
                    |   \xE0[\xA0-\xBF][\x80-\xBF]   # triple-byte sequences   1110xxxx 10xxxxxx * 2
                    |   [\xE1-\xEC][\x80-\xBF]{2}
                    |   \xED[\x80-\x9F][\x80-\xBF]
                    |   [\xEE-\xEF][\x80-\xBF]{2}';
            if ( 'utf8mb4' === $charset ) {
                $regex .= '
                    |    \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3
                    |    [\xF1-\xF3][\x80-\xBF]{3}
                    |    \xF4[\x80-\x8F][\x80-\xBF]{2}
                ';
            }
            $regex .= '){1,40}                          # ...one or more times
                )
                | .                                  # anything else
                /x';
            $value['value'] = preg_replace( $regex, '$1', $value['value'] );
            if ( false !== $length && mb_strlen( $value['value'], 'UTF-8' ) > $length ) {
                $value['value'] = mb_substr( $value['value'], 0, $length, 'UTF-8' );
            }

当以f09f94b9表示的“小蓝钻石”时,这个正则表达式将标记数据无效。当它以🔹表示时,则需要将该Unicode字符转换为WordPress所接受的表示形式。


2
这是不可能的。目前大约定义了112,000个UTF-8字符,但只有很少的HTML转义序列。HTML转义不是您要寻找的工具。相反,您需要确保所有工具链都使用UTF-8编码,以使这些字符不再特殊。实际上并不存在所谓的“特殊字符”,只有许多不同的字符。 - arkascha
@arkascha 谢谢,我已经更新了问题并说明了为什么我需要这样的函数。也许你可以给我建议 :) - Roland Soós
1
如前所述:Unicode序列是完全正确和有效的。问题不在于该序列,而在于您的工具链中至少有部分没有内部使用Unicode。这就是您想要改变的。解决问题的原因,而不是症状。 - arkascha
1个回答

3

以下是我想到的将所有字符转换的方法,你可以进一步修改它以仅转换所需范围内的字符。

$s = 'abcdef';
$a = preg_split('//u', $s, null, PREG_SPLIT_NO_EMPTY);

foreach($a as $c){
    echo '&#' . unpack('V', iconv('UTF-8', 'UCS-4LE', $c))[1] . ';';
}

在WordPress中,我们必须将字段更改为utf8mb4排序规则,这样就可以解决问题,而无需转换输入。顺便说一句,您的解决方案很棒,我甚至添加了一点改进 :) - Roland Soós

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接