替换包含表情符号的字符串中的@mentions

问题描述 投票: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 replace emoji multibyte mention
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.