关于正则表达式中的小写u修正符深刻理解
<?php
$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),'<hr>';
echo preg_replace('/(【[^】]*】)/', '', $str2),'<hr>';
echo preg_replace('/(【[^】]*】)/', '', $str3);
?>
各位看官,把上面代码跑下看看结果。。。
是不是觉得很奇怪,为什么1,3都能匹配到,就是$str2匹配不了。。。
在测试的时候,我就发现一个问题,就是你把$str2【】里的内容换成子母或者数字,就可以匹配到。。。当时我就想是不是字符的问题。。。但是还没有一个深刻的认识,今天在论坛请教一下,有一位高手解开了这个谜底。。。
你不在pattern后面加u修饰的话,正则表达式似乎是按单字节字符解释的,这样的话
[^】]的意思就是匹配\xe3,\x80,\x91以外的字符,而第二组中间刚好有个\x80,就不能匹配了
以下是$str2的编码情况。
\xe7\xbb\xb4\xe4\xbb\x96\xe5\xa5\xb6 \xe5\x8e\x9f\xe5\x91\xb3\xe8\xb1\x86\xe5\x a5\xb6250ml x6 X 3 \xe7\xbb\x84\xe5\x90\x88\xe8\xa3\x85\xe3\x80\x90\xe5\x93\x81
xe7\x89\x8c \xe4\xba\xa7\xe5\x9c\xb0 \xe4\xbf\x83\xe9\x94\x80\xe4\xbb\xb7\xe6\x a0\xbc \xe8\xaf\x84\xe8\xae\xba\xe3\x80\x91
我们再来对比下$str3的编码情况。
\xe7\xbb\xb4\xe4\xbb\x96\xe5\xa5\xb6 \xe5\x8e\x9f\xe5\x91\xb3\xe8\xb1\x86\xe5\x a5\xb6250ml x6 X 3 \xe7\xbb\x84\xe5\x90\x88\xe8\xa3\x85\xe3\x80\x90\xe8\xa1\x8c
xe6\x83\x85 \xe6\x8a\xa5\xe4\xbb\xb7 \xe4\xbb\xb7\xe6\xa0\xbc \xe8\xaf\x84\xe6\x b5\x8b\xe3\x80\x91