从数次at匹配正则的改进谈论坛用户名的混乱与矫正

2013-05-17 22:51:50 10 702
一、技术问题:
对于@的正则,知乎上有个参考,虽然不是php的:

像微博中的‘@用户名’和‘#话题#’这个正则表达式怎么写

【一】匹配 @用户名
首先分析下微博中从哪里开始到哪里结束才是一个完整的用户名,按照常规的表现形式,一般是以@开头,以:结尾,中间为用户的名称。
匹配表达式就可写为: @[^::]+
这是简单的写法,但是有些是在微博之后再@的,还有就是连续@的情况,还有些是以逗号等结束的,因此完善一下
修改为: @[^,,::\s@]+
但是这些匹配都是从形式上进行了一个大概的归类,但是为了更为严谨,就要彻底分析其用户名的具体格式,例如新浪微博中的用户名格式为是“4-30个字符,支持英文、数字、"_"或减号”
,也就是说,支持中文、字母、数字、下划线及减号,并且是4到30个字符(这里暂且认为汉字为一个字符)那么在写匹配的表达式的时候就可以这么来写:
@[\u4e00-\u9fa5a-zA-Z0-9_-]{4,30}

【二】匹配 #话题#
这个相对相对就简单了很多,前后都是#,以#号开始并以#结束
匹配表达式写为: #[^#]+#



二、T00ls的匹配史:

最开始的正则:
@([^\s@]+?)
,发现不加空格或者回车无法匹配;
第一次改进:
@([^\s@]+?)[\s::,,.。\[<]
,发现正常结束无法匹配;
第二次改进:
@([^\s@]+?)([\s::,,.。\[<]|$)
,发现部分汉字匹配不进去;
第三次改进:
@([".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_\-\.\']{3,30})
,发现汉字的符号匹配进去了;
第四次改进:暂不公布,若发现有论坛用户无法匹配的,请回帖告知。


三、混乱现象:

通过几次改进,发现论坛用户名的混乱:正常的是英文或者中文或者中英文混杂或者中文加数字或者英文加数字或者中英文加数字,不正常的有中文加日文,中文加生僻字,纯字符,邮箱做用户名,还有的有单引号。这些都是由于早期Discuz的过滤太松散了,于是从今天起,禁止在用户名里出现单引号,点或者@或者中文标点等符号。


四、矫正方法:

对于目前的用户名无法匹配的,给予改用户名机会一次;对于目前的用户名含.'@三个特殊符号的,给予改用户名机会一次。

对于其他用户,如果资金充足,想改用户名可以移步:https://www.t00ls.com/custom-modifyname.html

关于作者

t00ls管理团队01862篇文章2830篇回复T00ls认证管理员,如需认证,请联系admin@t00ls.net

努力建设T00ls……努力建设T00ls……努力建设T00ls……

评论10次

要评论?请先  登录  或  注册