如何从提及@username 生成 link 并将 link 放入具有多个 link 和提及名称 laravel 的描述中

how to generate link from mention @username and put link in description with multiple links and mention name laravel

我想生成一个 link 表单评论。

此处有两种类型的 link 由评论生成。

$string = "Hello @username you need to check this http://github.com and @username you need to https://whosebug.com/questions/ask";

提到的用户名和 link 并非每次都需要。

我得到了 link 的解决方案。

$comment_with_link = preg_replace('/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[A-Z0-9+&@#\/%=~_|]/i',"<a href=\"\0\">\0</a>",$string);

但现在我需要向@username 提出任何建议??

$comment_with_link = preg_replace('/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[A-Z0-9+&@#\/%=~_|]/i',"<a href=\"\0\">\0</a>",$string); //for links
$comment_with_link = preg_replace("/\b(@(\w+))/"," <a href='https://example.com/users/'>[=10=]</a> ", $comment_with_link); //for users
$comment_with_link = preg_replace("/\b(#(\w+))/"," <a href='https://example.com/colleges/'>[=10=]</a> ", $comment_with_link); //for colleges
//note: first replace link then the mention

示例输出

Helo @user1 from #college1, visit https://example.com   ----> Helo <a href="https://example.com/users/user1">@user1</a> from <a href="https://example.com/colleges/college1">#college1</a>, visit <a href="https://example.com">https://example.com</a>

如果用户名不是每次都出现,您可以将该部分设为可选并使用 2 个捕获组和 preg_replace_callback

在回调中检查组 1(用户名)的值是否不为空,并将组值用于 assemble link 的值。

(?<!\S)(?:(@[^\s@]+)(?!\S)[^h]*(?:h(?!ttp)[^h]*)*+)?\K((?:https?|ftp|file)://\S+)

说明

  • (?<!\S) 声明左空白边界
  • (?:非捕获组
    • (@[^\s@]+) 捕获 组 1 匹配用户名
    • (?!\S) 断言右空白边界
    • [^h]* 匹配 0+ 次除 h
    • 之外的任何字符
    • (?:非捕获组
      • h(?!ttp)[^h]* 仅当 ttp
      • 后面没有直接匹配时才匹配 h
    • )*+ 关闭群组并使用 possessive quantifier
    • 重复 0+ 次
  • )? 关闭群组并使其成为用户名的选项
  • \K忘记匹配的内容
  • ( 捕获 第 2 组
    • (?:https?|ftp|file) 匹配协议
    • ://\S+ 匹配 :// 后跟 1+ 次非空白字符
  • ) 关闭组 2

Regex demo | Php demo

$string = <<<STR
Hello @username you need to check this http://github.com
and @username you need to https://whosebug.com/questions/ask 
or https://whosebug.com
STR;

$pattern = "~(?<!\S)(?:(@[^\s@]+)(?!\S)[^h]*(?:h(?!ttp)[^h]*)*+)?\K((?:https?|ftp|file)://\S+)~";

$result = preg_replace_callback($pattern, function($m){
    return sprintf('<a href="%s">%s</a>', $m[2],$m[1] !== "" ?  $m[1] : $m[2]);
}, $string);

echo $result;

输出

Hello @username you need to check this <a href="http://github.com">@username</a>
and @username you need to <a href="https://whosebug.com/questions/ask">@username</a> 
or <a href="https://whosebug.com">https://whosebug.com</a>

备注

如果用户名和 url 之间不能出现 @,您可以使用 [^h@]* 而不是 [^h]*