php正则匹配仿微博@问题

不坏 发布于 2012/04/18 21:26
阅读 950
收藏 2

我现在要解析内容中@username 的 uid 

function Atuids($content,$num=10) {//获取@用户
global $_SGLOBAL;
	preg_match_all("/@(.+?)([\s|:]|$)/is", $content, $matches);
	$unames = $matches[1];
	$ns = "'".implode("','", $unames)."'";
	$csql = "username IN($ns)";
	if($unames){
		$query = $_SGLOBAL['db']->query("SELECT uid,username FROM ".tname('member')." WHERE $csql LIMIT 0, $num");
		while ($uvalues = $_SGLOBAL['db']->fetch_array($query)) {
		  if(!empty($uvalues)){
			  $uids[] = $uvalues;
		  }
		}
	}
	return $uids;
}

上面是我自己写的方法  

实现如下 

	//解析@用户通知
    $atme = Atuids($message,8);//只解析8个
	if($atme){
		foreach($atme as $atuid){
          if($atuid['uid'] && $atuid['uid'] != $_SGLOBAL['supe_uid']){
			  $note = cplang('note_doing_at_user', array("space.php?uid=$_SGLOBAL[supe_uid]&do=weibo&id=$newdoid"));
			  notification_add($atuid['uid'], 'doing', $note);
		  }
	    }
	}
 

以上基本能满足需求,但是我现在想优化一下正则 只在@后面2到14个字符内进行匹配 代码我修改成了 preg_match_all("/@(.+?)([\s|:]{2,14}|$)/is", $content, $matches); 匹配不准了 存在中文乱码了 ,求怎么解决 发现新浪微博@用户空格 解析不准的情况 如 “@放大范德萨雷锋啊 在吗? ” 这样的 就会误伤
加载中
1
中山野鬼
中山野鬼
中文内码不是一个byte,你需要判断是否ASCII标准字符还是扩展字符,才能符合你的2到14个这个数字所对应的对象。 简单的说就是,你需要通过判断当前字符占几个byte,来确认,而不是直接根据byte的方式来数。很多字符串操作,不爽就在这。老外靠字母吃饭的,不存在这个问题。
0
不坏
不坏

试了 [x80-xff_a-zA-Z0-9] 也不行,求解决方法

 

0
deleted
deleted

按字长 ~@(\S{2,14})~u

按字节 ~@(\S{2,14})~

按字节的话可能会把正常的汉字截断

不坏
不坏
是的 ,截断了就乱码了
0
不坏
不坏

preg_match_all("/@(.+?)([\s|:]{2,14}|$)/is", $content, $matches);上面我写错了 问题应该是在 [\s|:] 但是不知道怎么写

0
wsg
wsg
单纯看乱码问题的话,可以试试先把要匹配的内容转成UTF-8的,然后按 @ false 的说法,在正则模式中加上 u  
OSC老司机
OSC老司机
试试评论评论的评论的评论,如何实现
mahone
mahone
回复 @wsg : 嗯,求试完了给结果。。。
wsg
wsg
@不坏 那就去掉我说的转码那一步,直接在模式后面加上u 试试吧
不坏
不坏
我的程序默认都是utf-8编码
返回顶部
顶部