我正在尝试设计一个类似于stackoverflow中的注释/回复系统,如果在注释中提到@username,则会向他发送通知。
作为示例,请发表评论
$comment="hello @myname and @my-name and @my+name and @my%name and @my&name and @my_name and @my name @my/name and @3535 and @12";
问题是我的代码
if(preg_match('~@([^\s]+)~', $comment, $matches)){
print_r($matches);
}
只能找到用户名@myname
。有没有办法解决这个问题,以便它检测所有用户名?
此外,上面评论中提到的哪些用户名是stackoverflow中的有效用户名,例如my-name
,my%name
有效用户名,并且当它们被用于stackoverflow注释时被检测到。
最后,是否可以通过username
替换我的评论示例中的每个有效<strong>username</strong>
?
答案 0 :(得分:1)
您的代码存在的问题是preg_match()
函数找到第一个匹配的模式并返回true
或false
,而不会沿着字符串的其余部分向前移动。所以它不会通过下一个用户名。
对于这种包装,循环中的preg_match()
条件可能是一个很好的协议。
此代码应该完成!
$comment="hello @myname and @my-name and @my+name and @my%name and @my&name and @my_name and @my name @my/name and @3535 and @12";
$comment_arr = explode(' ', $comment);
// echo '<pre>';
// print_r($comment_arr);
// echo '</pre>';
$usernames = [];
$new_comment_arr = [];
for ($i=0; $i < count($comment_arr) ; $i++)
{
if( preg_match('/^@(.*)/', $comment_arr[$i]) )
{
array_push($usernames, $comment_arr[$i]); // push the usernames
array_push($new_comment_arr, '<strong>'.$comment_arr[$i].'</strong>'); // push the usernames with '<strong>' wrapped around in the new comments array
}
else
array_push($new_comment_arr, $comment_arr[$i]); // push the unmatched words(other words) in the new comments array
}
echo '<pre>';
print_r($new_comment_arr);
print_r($usernames);
echo '</pre>';
$new_comment = implode(' ', $new_comment_arr); // implode the new array
echo $new_comment; // the new comment with '<strong>' wrapped around the usernames
不应允许用户名@my name
。
在某些情况下,如果您希望用户名在URL中,则此类用户名将转换为@my%20name
。
也不要允许&{39; /
&#39;在用户名中,如果您重写URL,它将被视为参数,并可能导致404错误。
就我而言,您应该只在用户名中允许使用字母,数字和下划线(&#39; _
&#39;)。
答案 1 :(得分:0)
答案 2 :(得分:0)
我认为你必须收集所有开始在数组中使用char @的名称,这样你就可以将数组用于你想要的所有内容,例如通过循环数组向所有数组发送通知。 我已经制作了一个代码来容纳它。
<?php
$comment="hello @myname and @my-name and @my+name and @my%name and @my&name and @my_name and @my name @my/name and @3535 and @12";
$keywords = preg_split("/[\s]+/", $comment);
foreach($keywords as $row=>$value){
if(preg_match("/^@/",$value)==0){
unset($keywords[$row]);
}
}
print_r($keywords);
?>