如何在PHP 5.3中将Emojis转换为各自的HTML代码实体?

时间:2017-10-31 15:43:17

标签: php emoji php-5.3 html-entities html-encode

我需要将字符串中的Emojis(例如)转换为PHP 5.3网站上各自的HTML代码实体(例如😀)。

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

我也试过this solution,但它在PHP 5.3中不起作用,仅在5.4及以上版本中。 (我无法在此特定网站上升级到5.4,因为它所依赖的旧脚本仅适用于5.3,在任何情况下都无法更改或升级。)

我也尝试了this solution,它在PHP 5.3中运行,但是你不能用字符串来提供它,只能提供特定的表情符号,所以尽管在PHP 5.3中工作,它仍然无法解决我的问题。

需要转换字符串中的Emojis,没有别的。 (但是,如果那是不可能的,那么我想我可以使用其中的其他HTML实体,例如&&,但我更喜欢不是这种情况。)

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

2 个答案:

答案 0 :(得分:3)

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

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 stackoverflow answer to build each entity.

The pattern was directly ripped from this source on GitHub.

答案 1 :(得分:0)

我为此创建了一个特征,它是下面两个想法的结合,涵盖了像这样的缺失想法。 ?

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

取自https://gist.github.com/BarryMode/432a7a1f9621e824c8a3a23084a50f60#file-htmlemoji-php的想法 和 https://github.com/chefkoch-dev/morphoji

以上两种思想的结合。

trait ConvertEmojis {

/** @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)
    ];
}    

}