gpt4 book ai didi

PHP:将 UTF8 字符编码为 html 实体

转载 作者:行者123 更新时间:2023-12-04 03:33:54 27 4
gpt4 key购买 nike

我想将普通字符编码为 html 实体,例如

a => a
A => A
b => b
B => B

但是

echo htmlentities("a");

没用。它在 html 源代码中输出普通字符 (a A b B) 而不是 html 实体。

如何转换它们?

最佳答案

您可以使用 mb_ord 相当轻松地为此构建一个函数或 IntlChar::ord ,其中任何一个都会为您提供 Unicode 代码点的数值。

然后您可以使用 base_convert 将其转换为十六进制字符串, 并添加 '&#x' 和 ';'围绕它给出一个 HTML 实体:

function make_entity(string $char) {
$codePoint = mb_ord($char, 'UTF-8'); // or IntlChar::ord($char);
$hex = base_convert($codePoint, 10, 16);
return '&#x' . $hex . ';';
}
echo make_entity('a');
echo make_entity('€');
echo make_entity('🐘');

然后您需要为 UTF-8 字符串中的每个代码点运行它。使用 substr 之类的东西来遍历字符串是不够的,因为 PHP 的字符串函数处理单个字节,而每个 UTF-8 代码点可能是多个字节。

一种方法是使用具有 /./u 模式的正则表达式替换:

  • . 匹配每个单独的“字符”
  • /u修饰符开启Unicode模式,这样每一个被.匹配的“字符”都是一个完整的码位

然后您可以使用 preg_replace_callback 为每个匹配项(即每个代码点)运行上述 make_entity 函数.


由于 preg_replace_callback 将向你的回调传递一个匹配数组,而不仅仅是一个字符串,你可以制作一个 arrow function它获取数组并将元素 0 传递给真正的函数:

$callback = fn($matches) => make_entity($matches[0]);

所以把它放在一起,你有这个:

echo preg_replace_callback('/./u', fn($m) => make_entity($m[0]), 'a€🐘');

箭头函数是在 PHP 7.4 中引入的,所以如果你坚持使用旧版本,你可以编写与常规 anonymous function 相同的东西:

echo preg_replace_callback('/./u', function($m) { return make_entity($m[0]) }, 'a€🐘');

或者当然,只是一个常规的命名函数(或类或对象上的方法;有关不同的语法选项,请参阅 the "callable" page in the manual):

function make_entity_from_array_item(array $matches) {
return make_entity($matches[0]);
}
echo preg_replace_callback('/./u', 'make_entity_from_array_item', 'a€🐘');

关于PHP:将 UTF8 字符编码为 html 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67330803/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com