@ 中的空格在链接中提及用户名和小写字母

Posted

技术标签:

【中文标题】@ 中的空格在链接中提及用户名和小写字母【英文标题】:Space in @ mention username and lowercase in link 【发布时间】:2021-03-19 23:31:18 【问题描述】:

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

另外,我正在尝试将链接中的名称转换为小写字母(例如:profile?id=marielee,同时将提到的显示为大写,但无法做到。

这是我目前的代码:

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


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

?>

【问题讨论】:

这很难,因为如果你有 $string = 'I am @Marie Lee from Canada'; 怎么办?请注意,即使是像 *** 这样的强者也不会在 @ 提及中使用空格? @MonkeyZeus,可以理解。 :c 链接呢?那个我真的需要它。 您的convertHashTags() 函数必须检查数据库以查看您找到的任何@ 字符串是否是数据库中的实际用户并智能地提供&lt;a href&gt;。无论您是否允许或拒绝 @ 提及中的空格,这都是正确的。 什么链接呢?如果您去掉用户名中的空格,您的代码似乎可以工作 为什么要让你的 id 成为一个名字?名字几乎不是唯一的。还是只是您强制要求唯一的用户名? 【参考方案1】:

您可以根据字母数字字符、数字或空格过滤掉usernames,无需提取任何其他内容。确保在输入空格之前至少匹配一个字符,以避免空格与单个 @ 匹配。适用于最多 2 个空格分隔的单词,用户名后跟一个非单词字符(空格除外)。

<?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

【讨论】:

非常感谢您的帮助,@nice_dev。它适用于小写字母和空格,但是,由于某种原因,我不明白它会删除其余文本,只留下@提及。 @Elena 你能告诉我你的意见吗? @Elena 你的意思是'I am @Marie Lee, nice to meet you!'应该是innerHTML? 非常感谢,@nice_dev ! @Elena 您还可以在正则表达式的方括号中添加下划线 (_) 以匹配它们【参考方案2】:

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

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

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


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

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

【讨论】:

非常感谢@anubhava。它按我的需要工作!

以上是关于@ 中的空格在链接中提及用户名和小写字母的主要内容,如果未能解决你的问题,请参考以下文章

计算用户输入字符串中的数字、小写字母和标点符号的程序中的分段错误

题目:求出给定字符串中大写字母、小写字母、数字、空格及其他字符的个数。 注意 C++题目

快乐水题709. 转换成小写字母

mysql 为啥有些字段首字母是大写的在插入时会变成小写?

[PTA]习题8-9 分类统计各类字符个数

[PTA]实验8-2-6 分类统计各类字符个数