PHP mb 带有表情符号的子字符串功能

问题描述 投票:0回答:1

我有一条短信

😁😬😂😃@提及文字😂😃

我有 @Mention 文本部分的 $start 和 $length 值,但我无法正确更改文本,当字符串包含表情符号时,前面只有几个字母

javascript 从文本中传递 $start 和 length,它理解

$start = "😁😬😂😃 @Mention ".indexOf('@') //9

我需要的结果是这样的

😁😬😂😃 <span>@Mention text</span> 😂😃

PHP 中正确的函数是什么,我可以使用子字符串替换文本。 网上查了一下,没有解决办法

电流输出

😁😬😂😃 @Ment<span>ion text</span> 😂😃

$formatted = '😁😬😂😃 @Mention text 😂😃';
$content = $this->mb_substr_replace(
                    $formatted ?: '',
                    "<span class='mention-link'>" . mb_substr($formatted ?: '', $mention->getStart() ?: 0, $mention->getLength() ?: 0, 'UTF-8') . "</span>",
                    9,
                    5,
                    'UTF-8'
                );

以及函数本身

public function mb_substr_replace($string,$replacement,$start,$length=null,$encoding = null){
    if ($encoding == null){
        if ($length == null){
            return mb_substr($string,0,$start).$replacement;
        }
        else{
            return mb_substr($string,0,$start).$replacement.mb_substr($string,$start + $length);
        }
    }
    else{
        if ($length == null){
            return mb_substr($string,0,$start,$encoding).$replacement;
        }
        else{
            return mb_substr($string,0,$start,$encoding). $replacement. mb_substr($string,$start + $length,mb_strlen($string,$encoding),$encoding);
        }
    }
}
php emoji multibyte
1个回答
0
投票

我建议避免在此任务中使用所有

mb_
函数的卷积。一个简单的
preg_replace()
调用将允许您将 @mention 文本替换为所需的 HTML 标记。

代码:(PHPize演示

$text = '😁😬😂😃 @Mention text 😂😃';
echo preg_replace(
        '/(?<=^|\s)@\w+/',
        '<span class="mention-link">$0</span>',
        $text
     );
// 😁😬😂😃 <span class="mention-link">@Mention</span> text 😂😃
© www.soinside.com 2019 - 2024. All rights reserved.