Regex中的小寫u修正符深刻理解

來源:互聯網
上載者:User

先看一執行個體

 代碼如下 複製代碼

<?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修飾的話,Regex似乎是按單位元組字元解釋的,這樣的話
[^】]的意思就是匹配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)  即可匹配成功

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.