我需要将字符串中的Emojis(例如)转换为PHP 5.3网站上各自的HTML代码实体(例如
😀
)。
我需要这样做,以便用户输入正确存储在遗留脚本MySQL数据库中,以便以后显示回用户时正确显示。尝试直接从用户输入保存Emojis时,它们在其数据库中被错误地保存为?
。此遗留脚本不支持MySQL中的utf8mb4
(this 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 😎
?
答案 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.
答案 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)
];
}
}