如何从提及@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
$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]*
我想生成一个 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
$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]*