Ajax,如果多于一个@mention

时间:2018-12-23 19:46:27

标签: javascript php regex ajax

我正在尝试使用jquery ajax php创建一个Facebook和Twitter风格的提及系统,但是如果我尝试@提及超过一个用户,就会遇到问题。例如,如果我开始输入如下内容:

Hi @stack how are you. 

显示@stack的结果,但如果我尝试提及这样的另一个用户:

Hi @stack how are you. i am @azzo

然后结果一无所获。我想念我的Ajax代码吗,有人可以帮助我吗? 我认为搜索user_name存在正则表达式问题。当我在第一个类似@stack的用户名之后写一些用户名时,ajax请求发布此信息:

f   : smen
menFriend   : @stack
posti   : 102

但是,如果我想用相同的文本标记其他朋友,就像这样:

Hi @stack how are you. I am @a,然后ajax请求如下所示:

f   : smen
menFriend   : @stack, @a
posti   : 102

所以我要说的是,显然,ajax会查询以@开头的所有单词。它需要做的是查询数据库中的最后一个@mention。

   var timer = null;
   var tagstart = /@/gi;
   var tagword = /@(\w+)/gi;
   $("body").delegate(".addComment", "keyup", function(e) {
    var value = e.target.value;
    var ID = e.target.id;
    clearTimeout(timer);
    timer = setTimeout(function() {
      var contents = value; 
      var goWord = contents.match(tagstart);
      var goname = contents.match(tagword); 
      var type = 'smen'; 
      var data = 'f=' +type+ '&menFriend=' +goname +'&posti='+ID;
      if (goWord.length > 0) { 
             if (goname.length > 0) { 
                $.ajax({
                type: "POST",
                url: requestUrl + "searchuser", 
                data: data,
                cache: false,
                beforeSend: function() {
                    // Do Something
                },
                success: function(response) { 
                    if(response){
                        $(".menlist"+ID).show().html(response);
                    }else{
                        $(".menlist"+ID).hide().empty();
                    }
                }
              });
         } 
      }  
    }, 500); 
  });

这也是一个用于从数据库搜索用户的php部分:

   $searchmUser = mysqli_real_escape_string($this->db,$searchmUser);
   $searchmUser=str_replace("@","",$searchmUser);
   $searchmUser=str_replace(" ","%",$searchmUser);
   $sql_res=mysqli_query($this->db,"SELECT 
   user_name, user_id 
   FROM users WHERE 
   (user_name like '%$searchmUser%' 
   or user_fullname like '%$searchmUser%') ORDER BY user_id LIMIT 5") or die(mysqli_error($this->db));  
   while($row=mysqli_fetch_array($sql_res,MYSQLI_ASSOC)) {
           // Store the result into array
           $data[]=$row;
        }
        if(!empty($data)) {
           // Store the result into array
           return $data;
        }

1 个答案:

答案 0 :(得分:1)

好像您要发送的数组是AJAX请求中match的结果。

尽管我无法对其进行测试,但是您可以在正则表达式中使用前瞻性,并使用结果数组中的第一个元素。负前瞻(?!.*@\w)用于确保我们仅匹配最后一个元素。

   var timer = null;
   var tagword = /@(\w+)(?!.*@\w)/;

   $("body").delegate(".addComment", "keyup", function(e) {
      var value = e.target.value;
      var ID = e.target.id;
      clearTimeout(timer);
      timer = setTimeout(function() {
         var contents = value;
         var type = 'smen'; 
         var goname = contents.match(tagword); 

         if (goname != undefined) {
            var data = 'f=' +type+ '&menFriend=' +goname[1] +'&posti='+ID;
            $.ajax({
               type: "POST",
               url: requestUrl + "searchuser",
               data: data,
               cache: false,
               beforeSend: function() {
                  // Do Something
               },
               success: function(response) {
                  if(response){
                     $(".menlist"+ID).show().html(response);
                  } else {
                     $(".menlist"+ID).hide().empty();
                  }
               }
            });
         }
      }, 500);
   });