正規的好處就是易於上手,透過幾個小時的學習,大部分的正則就都可以看的懂了,雖然看得懂,但在實踐的過程中還是會遇到很多得不到自己想要結果的情況,畢竟正規的語法還是有些奇怪,本文就整理了一些關於在正規學習過程中常會犯的錯誤。
正規表示式
#一、空格
我們在平常寫程式碼的時候,空格通常是用來是讓程式碼更規範的工具,連同適當的縮排,行首的tab一起,讓程式碼看起來更為清晰。但在正則中可要小心了-空格本身也屬於一個要匹配的字符,不恰當的使用空格的話:
echo preg_match('/a{1, 3}/', "aaa") ? '匹配' : '不匹配'; // 不匹配
如上面這個正則,本意是匹配1~3個a,但實際上並不會配對到後面的3個a,因為{1, 3}中間多了一個空格,使得元字元「{}」的本意失效而變成了普通字元:
echo preg_match('/a{1, 3}/', "a{1, 3}") ? '匹配' : '不匹配'; // 匹配
「a {1, 3}」這個字串反而匹配上了,這顯然不是我們想要的,所以一定要注意,除非匹配的是空格字符本身,否則空格不要用:
echo preg_match('/a{1,3}/', "aaa") ? '匹配' : '不匹配'; // 匹配
※ 例外的,模式修飾符x可以將正則字串的空白字符忽略掉——然而只能忽略掉數據字符,像上例中的元字符中的空格還是會出現錯誤,通常來說這會讓正則變的更加難以理解,不太推薦使用:
echo preg_match('/a a a/x', "aaa") ? '匹配' : '不匹配'; // 匹配
二、大小寫
這個很好理解,基本上就是一個粗心大意的錯誤,畢竟我們平常用的搜尋工具裡搜尋字母通常大小寫都會被匹配,有時就會忘記正則中並不會自動的匹配大小寫:
echo preg_match('/flag/', "Flag") ? '匹配' : '不匹配'; // 不匹配
像這樣匹配的字符串中可能有首字母大寫的情況,自然就匹配不到了,這時候我們就要把大小寫的狀況都要考慮進來。不過有時候我們想要匹配某個單詞,只要是這4個字母連在一起都要匹配,寫起來就比較麻煩:
echo preg_match('/[Ff][Ll][Aa][Gg]/', "Flag") ? '匹配' : '不匹配'; // 匹配
雖然很難想像會有“fLaG”這種奇葩的寫法,但是不這樣寫畢竟無法匹配所有情況,但是有時候我們並不關心大小寫,要匹配的字符串卻很長,都這樣寫怕是要累死了,不過還好我們有“i”修飾符:
echo preg_match('/flag/i', "Flag") ? '匹配' : '不匹配'; // 匹配
修飾符「i」設定後,模式中的大小寫匹配將會不敏感。
三、貪婪模式
量詞「 」和「*」預設都是貪婪模式的,初學者在未遇到它所帶來的問題之前可能不明白這是什麼意思,下面kano來舉一個例子:
preg_match_all('/<span>.*<\/span>/', "<span>aaa</span><span>bbb</span>", $matches); var_dump($matches);
#正則的本意是找出字串中所有的span標籤,並把他們放到的一個數組中,然而結果很奇怪:兩個span竟然一次都被匹配上了!實際上想一想的話這也是合理的,字符串“aaabbb”確實是以開頭並以結尾的,只不過其中的.*匹配了太多的內容“aaabbb”都被匹配上了。這就是「 」和「*」的貪婪模式——預設他們會匹配盡量多的字符,而在後面加一個「?」可以取消這種貪婪模式,讓他們只匹配盡量少的內容:
preg_match_all('/<span>.*?<\/span>/', "<span>aaa</span><span>bbb</span>", $matches); var_dump($matches);
這次我們得到了想要的結果。
正規的語法比較特殊,若是不注意的話還是比較容易採坑的。
推薦學習:《正規表示式極速入門》
以上是新手入門學習正規表示式的常見錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!