改善识别和转换Unicode表情符号的功能

时间:2019-08-08 14:34:44

标签: php regex unicode emoji

我具有此功能,可以转换标签提及

<?php 

function convertAll($str) {
    $regex = "/[@#](\w+)/";
    //type and links
    $hrefs = [
        '#' => 'hashtag?tag',
        '@' => 'profile?username'
    ];

    $result = preg_replace_callback($regex, function($matches) use ($hrefs) {
         return sprintf(
             '<a href="%s=%s">%s</a>',
             $hrefs[$matches[0][0]],
             $matches[1], 
             $matches[0]
         );
    }, $str);

    return($result);
}

$text = "text example - #php text here @test text here";
//emoji list http://www.unicode.org/emoji/charts/emoji-list.html
//echo "\u{emoj};
//emoji test
echo '<div style="font-size: 100px;">';
echo "\u{1F30F}";
echo '</div>';
//function only
echo convertAll($text);

UNICODE EMOJI http://www.unicode.org/emoji/charts/emoji-list.html

因此,基于我的echo Unicode示例,我需要用Unicode字符替换与表情符号对应的Unicode代码点。

例如:
我想将U+1F617替换为\u{1F617}

给出格式为U + XXXXX的UNICODE代码点,我想使用正则表达式将其替换为实际的UNICODE字符。我该怎么办?

1 个答案:

答案 0 :(得分:0)

您当前使用的preg_replace_callback()假定所有正则表达式匹配项都将替换为链接。由于表情符号不会被用作链接的一部分,因此简单的解决方案是将preg_replace_callback()保持原样,在此之后执行Unicode替换的操作要额外增加一个步骤。

function convertAll($str) {
    $regex = "/[@#](\w+)/";
    //type and links
    $hrefs = [
        '#' => 'hashtag?tag',
        '@' => 'profile?username'
    ];

    $result = preg_replace_callback($regex, function($matches) use ($hrefs) {
         return sprintf(
             '<a href="%s=%s">%s</a>',
             $hrefs[$matches[0][0]],
             $matches[1], 
             $matches[0]
         );
    }, $str);

    $result = preg_replace("/U\+([A-F0-9]{5})/", '\u{${1}}', $result);

    return($result);
}

preg_replace()的正则表达式部分表示要匹配文字“ U”,然后是文字“ +”,再匹配5个实例字符A-Z或0-9。我们正在捕获这5个字符,并将其放在文字“ \ u {”之后,然后在其后加上文字“}”。

DEMO

preg_replace_callback()中可能有一种方法可以做到这一点,但这似乎比我现在愿意付出的努力更多。如果有人提出了答案,我很乐意看到它。

要替换为HTML实体,请改用preg_replace

$result = preg_replace("/U\+([A-F0-9]{5})/", "&#x\\1;", $result);