又更新了@信息功能

@Ta 2013-08-30 3705点击
@老虎会游泳    说说你过滤重复和截取小片段的方法呗我是foreach过滤重复,strpos获取所在位置,substr截取     
回复列表(11|隐藏机器人聊天)
  • xlm
    @Ta / 2013-08-30 / /
    preg_match()
  • @Ta / 2013-08-31 / /
    @胜永,我用正则表达式的回调函数(preg_replace_callback)获取数据,用函数中static(静态)变量避免重复(若相同名称已在static $user;数组中出现,则直接return)
  • @Ta / 2013-08-31 / /
    @老虎会游泳,那截取小片段呢
  • @Ta / 2013-08-31 / /
    preg_match
  • @Ta / 2013-08-31 / /
    @胜永,什么截取小片段?
  • @Ta / 2013-08-31 / /
    @老虎会游泳,  老虎会游泳在帖子“又更新了@信息功能”的回复中@:“@胜永,什么截取小片段?”     后面的这个啊   :“@胜永,什么截取小片段?”  
  • @Ta / 2013-09-01 / /
    @胜永
    function atinfo_add($fromuid,$title,$nr,$url) {
    static $i;
    $i++;
    if ($i > 50) return false;
    include __DIR__.'/../user/forbidden.php';
     if(!preg_match_all(
    "!(@|@)(#|#)?([\\x{4e00}-\\x{9fa5}A-Za-z0-9_\\-]{1,})(\x20|\\[|\xC2\xA0|\r|\n|\x03|\t|,|\\?|\\!|:|;|,|。|?|!|:|;|、|…|$)!u",$nr,$arr,PREG_SET_ORDER)) return false;
     if(mb_strlen($nr,'utf-8')>50) $nr=mb_substr($nr,0,50,'utf-8').'……';
     $uid=array();
     $name=array();
     $db=new dbclass('./db/user.db3');
     $db=$db->connect();
     $cnt=0;
     foreach($arr as $d) {
      if($d[2]) {
       if($uid[$d[3]]) continue;
       $x='uid';
      } else {
       if($name[$d[3]]) continue;
       $x='name';
       $name[$d[3]]=true;
      }
      $sql="select uid from user where $x=?";
      $rs=$db->prepare($sql);
      if(!$rs || !$rs->execute(array($d[3]))) continue;
      $id=$rs->fetch(PDO::FETCH_OBJ)->uid;
      if($id<1 or $uid[$id]) continue;
    
      $uid[$id]=true;
      static $rs2;
    userforbidden('atinfo', $fromuid);
      if(!$rs2) $rs2=$db->prepare('insert into atinfo(byuid,uid,url,txt,time,`read`,title) value(?,?,?,?,?,?,?)');
      if($rs2->execute(array($fromuid,$id,$url,$nr,$_SERVER['REQUEST_TIME'],0,$title))) $cnt++;
     }
    return $cnt;
    }
  • @Ta / 2013-09-01 / /
    @老虎会游泳,这个源码看到过了,没有看到你用preg_replace_callback啊
  • @Ta / 2013-09-01 / /
    @老虎会游泳,我 的是这样的
    function lstmsg($txt,$send='有人@你'){
              
              if(preg_match_all("!(@|@)([\\x{4e00}-\\x{9fa5}A-Za-z0-9_\\-]{1,})(\x20|&nbsp;|<|\xC2\xA0|\r|\n|\x03|\t|,|\\?|\\!|:|;|,|。|?|!|:|;|、|…|$)(.*?)!ue",$txt,$rs)){
    
                $s=preg_replace("!(@|@)([\\x{4e00}-\\x{9fa5}A-Za-z0-9_\\-]{1,})(\x20|&nbsp;|<|\xC2\xA0|\r|\n|\x03|\t|,|\\?|\\!|:|;|,|。|?|!|:|;|、|…|$)!ue","'@\\2 \\3'",$txt);
                
                    /* 为了捕捉小片段
                    如果输入的是 @100。。。。,那么将会变成 @100 。。。。,方便使用strpos函数获取字符所在位置
    
                    */
              $ary=array();
      
            foreach($rs[2] as $v){
    
                    $n=strpos($s,'@'.$v.' ');//得到所在位置
    
                    $msgtxt=mb_substr($s,$n,15,'utf-8').'......';//截取片段
    
                     if(ctype_digit($v)){//如果是纯数字,则认为是uid
    
                       $ary[$v]=$msgtxt;
    
                        continue;
                      
                      }else{//不是纯数字,
                        $ary[$this->getuid($v)]=$msgtxt;
                      }
                    }
                    
                    
              foreach ($ary as $key=>$val){//遍历数组,覆盖重复键名(键名就是uid)
                $arr[$key]=$val;
    
              }
              
               foreach ($arr as $key=>$val){//发送提醒信息
               
                  if($this->isdata($key)){//uid是否存在
                  
                        $this->lstmsg_add($key,$send.'[br]'.$val); 
                 
                 }
    
              }
              
              
            }
    
        }
    
  • @Ta / 2013-09-02 / /
    @胜永,我乱说的~~.
  • @Ta / 2013-09-02 / /
    @老虎会游泳,.........................
添加新回复
回复需要登录