Space 在@中提及用户名并在 link 中小写

Space in @ mention username and lowercase in link

我正在尝试创建一个提及系统,到目前为止我已经在 link 中转换了@username。但我想看看它是否有可能识别名称的空格。例如:@Marie Lee 而不是 @MarieLee.

此外,我正在尝试将 link 中的名称转换为小写字母(例如:profile?id=marielee,同时将提到的显示保留为大写字母,但未能成功。

到目前为止,这是我的代码:

<?php
function convertHashtags($str) {
    $regex = '/@+([a-zA-Z0-9_0]+)/';
    $str = preg_replace($regex, strtolower('<a href="profile?id=">[=12=]</a>'), $str);
    return($str);
}

$string = 'I am @Marie Lee, nice to meet you!';
$string = convertHashtags($string);
echo $string;

?>

您可以将此代码与 preg_replace_callback 和增强的正则表达式一起使用,该正则表达式将匹配所有 space 分隔的单词:

define("REGEX", '/@\w+(?:\h+\w+)*/');

function convertHashtags($str) {
    return preg_replace_callback(REGEX, function ($m) {
       return '<a href="profile?id=' . strtolower($m[0]) . '">[=10=]</a>';
    }, $str);

}

如果你只想允许 2 个单词,那么你可以使用:

define("REGEX", '/@\w+(?:\h+\w+)?/');

您可以根据字母数字字符、数字或 space 过滤掉 usernames,没有其他可提取的内容。确保在进行 space 之前至少匹配了一个字符,以避免空 space 与单个 @ 匹配。对于后跟非单词字符(space 除外)的用户名,最多 2 个 space 正确分隔的单词有效。

<?php
function convertHashtags($str) {
    $regex = '/@([a-zA-Z0-9_]+[\sa-zA-Z0-9_]*)/';
    if(preg_match($regex,$str,$matches) === 1){
        list($username,$name) = [$matches[0] , strtolower(str_replace(' ','',$matches[1]))];
        return "<a href='profile?id=$name'>$username</a>";
    }
    throw new Exception('Unable to find username in the given string');
}

$string = 'I am @Marie Lee, nice to meet you!';
$string = convertHashtags($string);
echo $string;

演示: https://3v4l.org/e2S8C


如果您希望文本在锚标记的 innerHTML 中按原样显示,您需要更改

list($username,$name) = [$matches[0] , strtolower(str_replace(' ','',$matches[1]))];

list($username,$name) = [$str , strtolower(str_replace(' ','',$matches[1]))];

演示: https://3v4l.org/dCQ4S