英文原文來自Smashing Magazine 。由笨活兒翻譯。轉載請註明出處。
正規表示式(Regular Expression, abbr. regex) 功能強大,能夠用於在一大串字元中找到所需資訊。它利用約定俗成的字元結構表達式來發生作用。不幸的是,簡單的正規表示式對於一些進階運用,功能遠遠不夠。若要進行篩選的結構比較複雜,你可能需要用到高階正規表示式。
本文為您介紹正規表示式的進階技巧。我們篩選出了八個常用的概念,並配上實例解析,每個例子都是滿足某種複雜要求的簡單寫法。如果你對正則的基本概念尚缺乏了解,請先閱讀這篇文章,或者這個教程,或者維基條目。
這裡的正規語法適用於PHP,與Perl相容。
1. 貪婪/懶惰
所有能多次限定的正規運算子都是貪婪的。他們盡可能地匹配目標字串,也就是說匹配結果會盡可能地長。不幸的是,這種做法並不總是我們想要的。因此,我們加入「懶惰」限定符來解決問題。在各個貪婪運算子後面加上“?”能讓表達式只符合盡可能短的長度。另外,修改器「U」也能惰化能多次限定的運算符。理解貪婪與懶惰的差異是運用高階正規表示式的基礎。
貪婪操作符
操作符* 符合先前的表達式零次或零次以上。它是一個貪婪操作符。請看下面的例子:
preg_match( '/<h1>.*< /h1>/', '</h1><h1>這是一個標題。</h1>
<h1>這是另一個。 </h1>', $matches );
句點(.)能代表除換行符外的任意字元。上面的正規表示式符合h1 標籤以及標籤內的所有內容。它用句點(.)和星號(*)來匹配標籤內的所有內容。匹配結果如下:
<h1>這是一個標題。 </h1>
<h1>這是另一個。 </h1>
整個字符串都被傳回。 * 操作符會連續匹配所有內容— 甚至包括中間的h1 閉合標籤。因為它是貪婪的,匹配整個字符串是符合其利益最大化原則。
懶惰操作符
把上面的式子稍作修改,加上一個問號(?),能讓表達式變懶惰:
/<h1>.*?< /h1>/</h1>
這樣它會覺得,只要配對到第一個h1 結尾標籤就完成任務了。
另一個有著類似屬性的貪婪操作符是{n,} 。它代表先前的配對模式重複n次或n次以上,如果沒有加上問號,它會尋找盡可能多的重複次數,加上的話,則會盡可能少重複(當然也就是「重複n次」最少)。
# 建立字符串
$str = 'hihihi oops hi';
# 使用貪婪的{n,}運算子進行匹配
preg_match( '/(hi){2,}/', $str, $matches ); # matches[0] 將是'hihihi'
# 使用墮化了的{n,}? 操作符匹配
preg_match( '/(hi){2,}?/', $str, $matches ); # matches[0] 將是'hihi'
出處:笨活兒