1 基礎知識
正規表示式是一種描述一段文字模式的方法。到目前為止,我們前面所使用過的精確(文字)匹配也是一種正規表示式。例如,前面我們曾經搜尋過正規表示式的術語,像是"shop"和"delivery"。
在PHP中,匹配正規表示式更有點像strstr()匹配,而不像相等比較,因為是在一個字串的某個位置(如果不指明則可能在字串中的任何位置)匹配另一個字串。例如,字串"shop"符合正規表示式"shop"。它也可以匹配正規表示式"h"、"ho",等。
除了精確匹配字元外,還可以用特殊字元來指定表達式的元意(meta-meaning)。例如,使用特殊字 符,可以指定一個在字串開始或末尾肯定存在的模式,該模式的某部分可能被重複,或模式中的字元屬於特定的某一類型。另外,也可以依特殊字元的出現來匹 配。接下來,我們將逐一討論這些變化。
2 字元集和類別
使用字元集可以馬上給出比精確匹配功能還要強大的正規表示式。字元集可以用於匹配屬於特定類型的任何字元;事實上它們是一種通配符。
首先,可以用字元作為一個通配符來取代除換行符(\n)之外的任一個字元。例如,正規表示式:
.at
可以與"cat"、"sat"和"mat"等進行比對。通常,這種通配符匹配用於作業系統中的檔案名稱匹配。
但是,使用正規表示式,可以更具體地說明希望匹配的字元類型,而且可以指明字元所屬的一個集合。在前面的例子中,正規表示式符合"cat"和"mat",但也可以符合"#at"。如果要限定它是a到z之間的字符,就可以像下面這樣指明:
[a-z]at
任何包含在方括號([])中的內容都是一個字符類——一個被匹配字符所屬的字元集合。請注意,方括號中的表達式只符合一個字元。
我們可以列出一個集合,例如:
[aeiou]
可以用來表示母音子母。
也可以描述一個範圍,正如前面用連字符那樣,也可以是一個範圍集:
[a-zA-Z]
這個範圍集代表任何的大小寫字母。
此外,也可以用集合來指明字元不屬於某個集合。例如:
[^a-z]
可以用來匹配任何不在a和z之間的字元。當把脫字符號(^)包括在方括號裡面時,表示否。當符號用在方括號的外面,則表示另一個意思,我們稍後將詳細介紹。
3 重複
通常,讀者會希望指明某個字串或字元類別將會不只一次地出現。可以在正規表示式中使用兩個特殊字元來代替。符號「*」表示這個模式可以重複0次或更多次,符號「 」則表示這個模式可以重複1次或更多次。這兩個符號應該放在要作用的表達式的後面。
例如:
[[:alnum:]]+
表示「至少有一個字母字元」。
4 子表達式
通常,將一個表達式分隔為幾個子表達式是非常有用的,例如,可以表示「至少這些字串中的一個需要精確匹配」。可以使用圓括號來實現,與數學表達式中的方法一樣。
例如:
(very)*large
可以匹配"large"、"very large"、"very very large"等。
5 子表達式計數
可以用在花括號({})中的數字表達式來指定內容允許重複的次數。可以指定一個確切的重複次數({3}表示重複3次),或一個重複次數的範圍({2,4}表示重複2~4次),或一個開底域的重複範圍({2, }表示至少要重複兩次)。
例如:
(very){1,3}
表示符合"very"、"very very"和"very very very"。
6 定位到字串的開始或結尾
[a-z]模式將符合任何包含了小寫字母字元的字串。無論該字串只有一個字符,或者在整個更長的字串中只包含一個匹配的字符,都沒有關係。
也可以確定一個特定的子表達式是否出現在開始、結尾或在兩個位置都出現。當要確定字串中只有要找的單字而沒有其他單字出現時,它將相當有用。
脫字符號(^)用於正規表示式的開始,表示子字串必須出現在被搜尋字串的開始處,字元「$」用於正規表示式的結尾,表示子字串必須出現在字串的末尾。
例如,以下是在字串開始處匹配bob:
^bob
這個模式將匹配com出現在字串末尾處的字串:
com$
最後,這個模式將匹配只包含a到z之間一個字元的字串:
^[a-z]$
7 分支
可以使用正则表达式中的一条竖线来表示一个选择。例如,如果要匹配com、edu或net,就可以使用如下所示的表达式:
com|edu|net
8 匹配特殊字符
如果要匹配本节前面提到过的特殊字符,例如,.、{或者$,就必须在它们前面加一个反斜杠(\)。如果要匹配一个反斜杠,则必须用两个反斜杠(\\)来表示。
在PHP中,必须将正则表达式模式包括在一个单引号字符串中。使用双引号引用的正则表达式将带来一些不必要的复杂性。PHP还使用反斜杠来转义特殊字符——例如反斜杠。
如果希望在模式中匹配一个反斜杠,必须使用两个反斜杠来表示它是一个反斜杠字符,而不是一个转义字符。
同样,由于相同的原因,如果希望在一个双引号引用的PHP字符串中使用反斜杠字符,必须使用两个反斜杠。这可 能会有些混淆,这样要求的结果将是表示一个包含了反斜杠字符的正则表达式的一个PHP字符串需要4个反斜杠。PHP解释器将这4个反斜杠解释成2个。然 后,由正则表达式解释器解析为一个。
$符号也是双引号引用的PHP字符串和正则表达式的特殊字符。要使一个$字符能够在模式中匹配,必须使用“\\\$”。因为这个字符串被引用在双引号中,PHP解释器将其解析为\$,而正则表达式解释器将其解析成一个$字符。
9 在智能表单中应用
在智能表单应用程序中,正则表达式至少有两种用途。第一种用途是在顾客的反馈中查找特定的名词。使用正则表达 式,可以做得更智能一些。使用一个字符串函数,如果希望匹配"shop"、"customer service"或"retail",就必须做3次不同的搜索。如果使用一个正则表达式,就可以同时匹配所有3个,如下所示:
shop|customer service|retail
第二个用途是验证程序中用户的电子邮件地址,这需要通过用正则表达式来对电子邮件地址的标准格式进行编码。这 个格式中包含一些数字或标点符号,接着是符号“@”,然后是包括文字或数字和字符组成的字符串,后面接着是一个“.”(点号),后面包括文字或数字以连字 符组成的字符串,可能还有更多的点号,直到字符串结束,它的编码如下所示:
^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$
子表达式^[a-zA-Z0-9_\-.]+表示“至少由一个字母、数字、下画线、连字符、点号或者这些字符组合为开始的字符串”。请注意,当在一个字符类的开始或末尾处使用点号时,点号将失去其特殊通配符的意义,只能成为一个点号字符。
符号“@”匹配字符“@”。
而子表达式[a-zA-Z0-9\-]+与包含文字数字字符和连字符的主机名匹配。请注意,我们去除了连字符,因为它是方括号内的特殊字符。
字符组合“\.”匹配“.”字符。我们在字符类外部使用点号,因此必须对其转义,使其能够匹配一个点号字符。
子表达式[a-zA-Z0-9\-\.]+$匹配域名的剩下部分,它包含字母、数字和连字符,如果需要还可包含更多的点号直到字符串的末尾。
不难发现,有时一个无效的电子邮件地址也会符合这个正则表达式。找到所有无效电子邮件几乎是不可能的,但是经 过分析,情形将会有所改善。可以按许多不同的方式精化这个表达式。例如,可以列出所有有效的顶级域(TLD)。当对某些对象进行限制的时候,请千万小心, 因为可能排斥1%的有效数据的校验函数比允许出现10%的无效数据的校验函数还要麻烦。
推荐:《PHP教程》
以上是PHP POSIX正規表示式的詳細內容。更多資訊請關注PHP中文網其他相關文章!