@ 中的空格在链接中提及用户名和小写字母
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()
函数必须检查数据库以查看您找到的任何@
字符串是否是数据库中的实际用户并智能地提供<a href>
。无论您是否允许或拒绝 @
提及中的空格,这都是正确的。
什么链接呢?如果您去掉用户名中的空格,您的代码似乎可以工作
为什么要让你的 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。它按我的需要工作!以上是关于@ 中的空格在链接中提及用户名和小写字母的主要内容,如果未能解决你的问题,请参考以下文章
计算用户输入字符串中的数字、小写字母和标点符号的程序中的分段错误