如何在 PHP 5.3 中将表情符号转换为各自的 HTML 代码实体?

How to convert Emojis to their respective HTML code entities in PHP 5.3?

我需要在 [=47= 上将字符串中的表情符号(例如 )转换为它们各自的 HTML 代码实体(例如 😀) ] 5.3 网站.

我需要这样做,以便用户输入可以正确存储在遗留脚本中 MySQL 数据库,以便稍后在向用户显示时正确显示。尝试直接从用户输入中保存表情符号时,它们在其数据库中被错误地保存为 ?。此遗留脚本不支持 MySQL 中的 utf8mb4this solution 失败),所有将其数据库、表和列转换为 utf8mb4 的尝试都 不支持 解决了这个问题,所以我已经确认有效的唯一解决方案是将用户输入的字符串中的表情符号转换为它们各自的 HTML 代码实体,以正确地将这些实体按原样存储在数据库中以便它们在检索时正确显示为表情符号,因为现代浏览器会自动将这些表情符号实体转换为表情符号字符。

我也试过 但它在 PHP 5.3 中不起作用,仅在 5.4 及更高版本中起作用。 (我无法在此特定站点上升级到 5.4,因为它所依赖的遗留脚本只能在 5.3 中使用,并且在任何情况下都无法更改或升级。)

我也试过 this solution,它在 PHP 5.3 中有效,但是你不能给它一个字符串,只能给它特定的表情符号,所以它没有解决我的问题,尽管在PHP5.3.

需要转换字符串中的表情符号,没有别的。 (但是,如果这不可能,那么我想我可以接受其他 HTML 实体被它转换,比如 &&,但我不希望这样。 )

那么如何将字符串中的表情符号转换为 PHP 5.3 中各自的 HTML 代码实体,以便将 this & that 之类的字符串转换为 this & that 😎

检测表情符号的代码绕过了 Whosebug 的字符限制,所以这里有一个要点:

https://gist.github.com/BarryMode/432a7a1f9621e824c8a3a23084a50f60#file-htmlemoji-php

整个功能本质上就是

preg_replace_callback(pattern, callback, string);

string 是您要将表情符号更改为 html 实体的输入。 pattern 使用正则表达式在字符串中查找表情符号,然后将每个表情符号输入 callback,这是从表情符号到 html 实体的转换。

在创建此函数时,htmlemoji(),我结合了其他人编写的几段不同的代码。这是一些学分:

The callback uses this Whosebug answer to build each entity.

The pattern was directly ripped from this source on GitHub.

我为此创建了一个特征,它是下面两个想法的混合体,它涵盖了缺失的部分。

如何在 PHP 5.3

中将表情符号转换为各自的 HTML 代码实体

灵感来自https://gist.github.com/BarryMode/432a7a1f9621e824c8a3a23084a50f60#file-htmlemoji-phphttps://github.com/chefkoch-dev/morphoji

以上两种想法的结合。

特质转换表情符号{

/** @var string */
protected static $emojiPattern;

public function convert($str) {

    return preg_replace_callback($this->getEmojiPattern(), array(&$this, 'entity'), $str);
}

protected function entity($matches) {
    return '&#'.hexdec(bin2hex(mb_convert_encoding("$matches[0]", 'UTF-32', 'UTF-8'))).';';
}

/**
 * Returns a regular expression pattern to detect emoji characters.
 *
 * @return string
 */
protected function getEmojiPattern()
{
    if (null === self::$emojiPattern) {
        $codeString = '';

        foreach ($this->getEmojiCodeList() as $code) {
            if (is_array($code)) {

                $first = dechex(array_shift($code));
                $last  = dechex(array_pop($code));
                $codeString .= '\x{' . $first . '}-\x{' . $last . '}';

            } else {
                $codeString .= '\x{' . dechex($code) . '}';
            }
        }

        self::$emojiPattern = "/[$codeString]/u";
    }

    return self::$emojiPattern;
}

/**
 * Returns an array with all unicode values for emoji characters.
 *
 * This is a function so the array can be defined with a mix of hex values
 * and range() calls to conveniently maintain the array with information
 * from the official Unicode tables (where values are given in hex as well).
 *
 * With PHP > 5.6 this could be done in class variable, maybe even a
 * constant.
 *
 * @return array
 */
protected function getEmojiCodeList()
{
    return [
        // Various 'older' charactes, dingbats etc. which over time have
        // received an additional emoji representation.
        0x203c,
        0x2049,
        0x2122,
        0x2139,
        range(0x2194, 0x2199),
        range(0x21a9, 0x21aa),
        range(0x231a, 0x231b),
        0x2328,
        range(0x23ce, 0x23cf),
        range(0x23e9, 0x23f3),
        range(0x23f8, 0x23fa),
        0x24c2,
        range(0x25aa, 0x25ab),
        0x25b6,
        0x25c0,
        range(0x25fb, 0x25fe),
        range(0x2600, 0x2604),
        0x260e,
        0x2611,
        range(0x2614, 0x2615),
        0x2618,
        0x261d,
        0x2620,
        range(0x2622, 0x2623),
        0x2626,
        0x262a,
        range(0x262e, 0x262f),
        range(0x2638, 0x263a),
        0x2640,
        0x2642,
        range(0x2648, 0x2653),
        0x2660,
        0x2663,
        range(0x2665, 0x2666),
        0x2668,
        0x267b,
        0x267f,
        range(0x2692, 0x2697),
        0x2699,
        range(0x269b, 0x269c),
        range(0x26a0, 0x26a1),
        range(0x26aa, 0x26ab),
        range(0x26b0, 0x26b1),
        range(0x26bd, 0x26be),
        range(0x26c4, 0x26c5),
        0x26c8,
        range(0x26ce, 0x26cf),
        0x26d1,
        range(0x26d3, 0x26d4),
        range(0x26e9, 0x26ea),
        range(0x26f0, 0x26f5),
        range(0x26f7, 0x26fa),
        0x26fd,
        0x2702,
        0x2705,
        range(0x2708, 0x270d),
        0x270f,
        0x2712,
        0x2714,
        0x2716,
        0x271d,
        0x2721,
        0x2728,
        range(0x2733, 0x2734),
        0x2744,
        0x2747,
        0x274c,
        0x274e,
        range(0x2753, 0x2755),
        0x2757,
        range(0x2763, 0x2764),
        range(0x2795, 0x2797),
        0x27a1,
        0x27b0,
        0x27bf,
        range(0x2934, 0x2935),
        range(0x2b05, 0x2b07),
        range(0x2b1b, 0x2b1c),
        0x2b50,
        0x2b55,
        0x3030,
        0x303d,
        0x3297,
        0x3299,

        // Modifier for emoji sequences.
        0x200d,
        0x20e3,
        0xfe0f,

        // 'Regular' emoji unicode space, containing the bulk of them.
        range(0x1f000, 0x1f9cf)
    ];
}    

}