代码之家  ›  专栏  ›  技术社区  ›  ProgrammerGirl

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

  •  9
  • ProgrammerGirl  · 技术社区  · 7 年前

    我需要转换表情符号(例如。 😀 )字符串到各自的HTML代码实体(例如。 😀 )在PHP 5.3网站上。

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

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

    我也试过了 this solution ,它在PHP 5.3中工作,但不能为其提供字符串,只能提供特定的表情符号,因此尽管在PHP 5.3中工作,但它并不能解决我的问题。

    只有 需要转换字符串中的表情符号,其他什么都不需要。(然而,如果这不可能,那么我想我可以使用其他HTML实体进行转换,例如 & & ,但我希望情况并非如此。)

    那么,我如何在PHP 5.3中将字符串中的表情符号转换为它们各自的HTML代码实体呢 this & that 😎 this & that 😎 ?

    2 回复  |  直到 7 年前
        1
  •  9
  •   Barry    7 年前

    检测表情符号的代码绕过了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.

        2
  •  2
  •   Andyc    4 年前

    我创造了一个特点,这是一个混合的两个想法贝娄,它涵盖了失踪的人一样。🤩

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

    想法来自 https://gist.github.com/BarryMode/432a7a1f9621e824c8a3a23084a50f60#file-htmlemoji-php https://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)
        ];
    }    
    

    }