谈谈PHP的正则表达式

最近在写一个微博客户端,很多逻辑功能实现想自己重新写一遍。其中遇到微博的用户名匹配问题。困扰了很久。终于解决,于是乎对PHP的正则匹配模式有了一定的认识。在这里记录一下,一来当作笔记以作以后的复习,二来也希望能跟大家分享一下经验。


具体说一下我遇到的问题吧,大家对新浪微博也十分清楚了。对于正则表达式匹配用户名这一块网上也有许多实现。我在这里也不打算多讲。
但是其中遇到的就是当正则表达式中包含中文字符的时候(其实对于包含中文汉字的正则表达式也可能会出错),匹配结果的输出会出现乱码。而这个乱码是大家很熟悉的“�”,哈?不知道?那我告诉你,当UTF-8的字符被解析为GBK的时候,且UTF-8字符在转换到GBK的时候无法找到对应的编码,就会出现这个“�”。


很明显,这就是编码问题导致的。如何解决?网上有许多网友也很纠结。我也是谷歌了半天也不见答案。于是乎,最终只能苦逼地去PHP官网找文档了。


皇天不负有心人,我在这个页面找到了答案:http://php.net/manual/zh/reference.pcre.pattern.modifiers.php


这里解释的是PHP关于正则表达式的各种模式(基于类似于perl的正则匹配模式的,所以用的是PCRE)


在这里问简略地解释一下:


i模式:大小字母不敏感匹配


m模式:单行匹配


s模式:“.”修饰符所有匹配,也就是能够匹配换行符,也可以理解为多行匹配


x模式:非严格匹配,对于不能解析的字符,采取的是忽略匹配方式,但不能忽略空格


e模式:执行匹配,在匹配字段前会对替换表达式进行eval操作,也就是语句执行,再替换符合表达式的结果


A模式:“锚定”模式,匹配从目标字符串开始位置搜索


D模式:忽略换行模式,一般来说$匹配字符串末尾或者是换行符,但是在这种模式下,换行符将会被忽略


S模式:非“锚定”模式,这个我可能还得去实践一下才能了解具体功能,但是根据文档的解释,这是一直多数据匹配的性能优化模式


U模式:非贪婪模式,不需多说


X模式:事实上没多大用,就是当不需要转义的字符被转义了,表达式将会报错


J模式:允许字组重名的一个模式


u模式:BINGO!That's what I want!在这个模式下,模式字符串会被认为是UTF-8编码,于是乎,用了这种模式,匹配的结果不再出现乱码!


而对于PHP的中文匹配,可能大多数人都了解,\x{4e00}-\x{9fa5}就是中文符集,在此不再多说。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值