<?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