教学之友,学习之友。

站长教学网

当前位置: 站长教学网 > 网站编程 > PHP教程 >

preg_match正则匹配中文出现乱码错误的bug

时间:2013-09-22 12:48来源:未知 作者:ken 点击:

论坛上的一个网友提出的问题,在ascii编码的php文件中,定义的一个函数,简单描述如下:

function checkpost()

{

global $subject

$censoww=array(‘婊”);

preg_match(‘/’ . implode(‘|’, $censoww) . ‘/i’, $subject,$matches) ) { echo “非法内容”;}

这是一个简单的禁字检测程序,广泛应用在bbs等程序中.可是这里出现了个问题,但$subject=’存活’ 或者 ‘存货’等时,这个程序竟然也提示非法内容。首先我提倡在程序中统一使用utf-8编码,当然这个程序在utf-8编码下应该没有问题的,可是在ascii下,就会有一些奇怪的bug。这位网页的程序都是基于gbk的,不可能全部转码,只能打打补丁了,下面是简单的解决方案:

mb_internal_encoding(‘gbk’);//指定网络编码为gbk,这同时也作为正则匹配的编码

function checkpost()

{

global $subject

$censoww=array(‘婊”);

//这里使用mb_eregi 代替preg_match,mb_eregi本身支持多字节的正则匹配

int mb_eregi ( string $pattern , string $string [, array $regs ] )

if(mb_eregi( implode(‘|’, $censoww) , $subject,$matches) ) { echo “非法内容”;}

顺便翻译了下手册中关于这个函数的简单说明 站长教学网 eduyo.com

mb_eregi() executes the regular expression match with multibyte support, and returns 1 if matches are found. This function ignore case. If the optional third parameter was specified, the function returns the byte length of matched part, and the array regs will contain the substring of matched string.
mb_eregi(),支持忽略大小写的多字节正则匹配,如果匹配成功,返回1,如果指定第三个可选参数,函数就返回匹配部分字节数,同时把所有匹配到的子串放在第三个参数指定的数组变量中
 

(责任编辑:ken)
TAG标签: 正则 preg_match
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
注册登录:不允许匿名留言,登录后留言无需输入验证码。
栏目列表
最新内容