如何使用preg_match检测评论中的用户名?

时间:2015-08-30 03:46:44

标签: php regex string text

我正在尝试设计一个类似于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-namemy%name有效用户名,并且当它们被用于stackoverflow注释时被检测到。

最后,是否可以通过username替换我的评论示例中的每个有效<strong>username</strong>

3 个答案:

答案 0 :(得分:1)

您的代码存在的问题是preg_match()函数找到第一个匹配的模式并返回truefalse,而不会沿着字符串的其余部分向前移动。所以它不会通过下一个用户名。 对于这种包装,循环中的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)

为什么不尝试使用社交插件进行评论

我建议您使用Facebook插件进行评论

了解更多详情http://developers.facebook.com/docs/plugins/comments

答案 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);
?>