先看一实例
代码如下 | 复制代码 |
$str = ‘【宏?E1-471G-53214G50Mnks】宏?(acer)E1-471G-53214G50Mnks 14英寸笔记本电脑(i5-3210M 4G 500G GT630M 1G独显 USB3.0 )黑色【行情 报价 价格 评测】’; $str2 = ‘维他奶 原味豆奶250ml x6 X 3 组合装【品牌 产地 促销 价格 评论】’; $str3 = ‘维他奶 原味豆奶250ml x6 X 3 组合装【行情 报价 价格 评测】’; echo preg_replace(‘/(【[^】]*】)/’, ”, $str),’ ’; echo preg_replace(‘/(【[^】]*】)/’, ”, $str2),’ ’; echo preg_replace(‘/(【[^】]*】)/’, ”, $str3); ?>
|
各位看官,把上面代码跑下看看结果。。。
是不是觉得很奇怪,为什么1,3都能匹配到,就是$str2匹配不了。。。
在测试的时候,我就发现一个问题,就是你把$str2【】里的内容换成子母或者数字,就可以匹配到。。。当时我就想是不是字符的问题。。。但是还没有一个深刻的认识,今天在论坛请教一下,有一位高手解开了这个谜底。。。
你不在pattern后面加u修饰的话,正则表达式似乎是按单字节字符解释的,这样的话
[^】]的意思就是匹配xe3,x80,x91以外的字符,而第二组中间刚好有个x80,就不能匹配了
以下是$str2的编码情况。
>>> ‘维他奶 原味豆奶250ml x6 X 3 组合装【品牌 产地 促销 价格 评论】’.decode(‘gb2
312′).encode(‘utf8′)
‘xe7xbbxb4xe4xbbx96xe5xa5xb6 xe5x8ex9fxe5x91xb3xe8xb1x86xe5x
a5xb6250ml x6 X 3 xe7xbbx84xe5x90x88xe8xa3x85xe3x80x90xe5x93x81
xe7x89x8c xe4xbaxa7xe5x9cxb0 xe4xbfx83xe9x94x80xe4xbbxb7xe6x
a0xbc xe8xafx84xe8xaexbaxe3x80x91‘
我们再来对比下$str3的编码情况。
>>> ‘维他奶 原味豆奶250ml x6 X 3 组合装【行情 报价 价格 评测】’.decode(‘gb2312′).encode(‘utf8′)
‘xe7xbbxb4xe4xbbx96xe5xa5xb6 xe5x8ex9fxe5x91xb3xe8xb1x86xe5x
a5xb6250ml x6 X 3 xe7xbbx84xe5x90x88xe8xa3x85xe3x80x90xe8xa1x8c
xe6x83x85 xe6x8axa5xe4xbbxb7 xe4xbbxb7xe6xa0xbc xe8xafx84xe6x
b5x8bxe3x80x91‘
>>>
看到红色标记的区别了吗???这就是为什么那么匹配中文,或者全角字符的表达式里都需要用小写u作为修正符。。。之前只是知道有这么一回事,但是真正算是理解的,就是这次了。。。
所以,只要把表达式改为:preg_replace(‘/(【[^】]*】)/u’, ”, $str2) 即可匹配成功
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔