萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php正則表達式入門篇(1/3)

php正則表達式入門篇(1/3)

1.正則表達式基礎知識
含義:由普通字符和(a-z)和一些特殊字符組成的字符串模式
功能:有效性驗證。
替換文本。
從一個字符串提取一個子字符串。
分類:POSIX和Perl
POSIX風格更容易掌握,但不能用於二進制模式,而perl相對比較復雜。
2.POSIX風格的正則表達式
1.編寫正則表達式
表4.3 POSIX正則表達式語法格式列表
字 符
 描 述
 

 轉義字符,用於轉義特殊字符。例如,'.'匹配單個字符,'.'匹配一個點號。'-'匹配連字符'-',''匹配符號''
 
^
 匹配輸入字符串的開始位置。例如'^he'表示以'he'開頭的字符串
 
$
 匹配輸入字符串的結束位置。例如,'ok$'表示以'ok'結尾的字符串
 
*
 匹配前面的子表達式零次或多次。例如,'zo*'能匹配"z"以及"zoo"。*等價於{0,}
 
+
 匹配前面的子表達式一次或多次。例如,'zo+'能匹配"zo"以及"zoo",但不能匹配"z"。+等價於{1,}
 
?
 匹配前面的子表達式零次或一次。例如,'do(es)?'可以匹配"do"或"does"中的"do"。'?'等價於{0,1}
 
{n}
 n是一個非負整數。匹配確定的n次。例如,'o{2}'不能匹配"Bob"中的'o',但是能匹配"food" 中的兩個'o'
 
{n,}
 n是一個非負整數。至少匹配n次。例如,'o{2,}'不能匹配"Bob"中的'o',但能匹配"foooood" 中的所有'o'。'o{1,}'等價於'o+'。'o{0,}'則等價於'o*'
 
{n,m}
 m和n均為非負整數,其中n≤m。最少匹配n次且最多匹配m次。例如,"o{1,3}"將匹配"fooooood"中的前三個'o'。'o{0,1}'等價於'o?'。請注意在逗號和兩個數之間不能有空格
 
?
 當該字符緊跟在任何一個其他限制符(*, +, ?, {n}, {n,}, {n,m})後面時,匹配模式是非貪婪的。非貪婪模式盡可能少地匹配所搜索的字符串,而默認的貪婪模式則盡可能多地匹配所搜索的字符串。例如,對於字符串"oooo",'o+?'將匹配單個"o",而'o+' 將匹配所有'o'
 
.
 匹配除"n"之外的任何單個字符,要匹配包括'n' 在內的任何字符,可以使用'[.n]'的模式
 
(pattern)
 匹配pattern並獲取這一匹配。所獲取的匹配保存到相應的數組中。要匹配圓括號字符,請使用 '(' 或 ')'
 
(?:pattern)
 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲。這在使用"或"|"來組合一個模式的各個部分時很有用。例如,'industr(?:y|ies).就是一個比'industry|industries'更簡略的表達式
 
(?=pattern)
 正向預查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如,'Windows(?=95|98|NT|2000)'能匹配"Windows 2000"中的"Windows",但不能匹配"Windows 3.1"中的"Windows"。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始
 
(?!pattern)
 負向預查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如'Windows(?!95|98|NT|2000)'能匹配"'Windows 3.1"中的"Windows",但不能匹配"Windows 2000"中的"Windows"。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始
 
x|y
 匹配x或y。例如,'z|food' 能匹配"z"或"food",'(z|f)ood'則匹配"zood"或"food"
 
[xyz]
 字符集合。匹配所包含的任意一個字符。例如,'[abc]'可以匹配"plain"中的'a'
 
[^xyz]
 負值字符集合。匹配未包含的任意字符。例如,'[^abc]'可以匹配"plain"中的'p'
 
[a-z]
 字符范圍。匹配指定范圍內的任意字符。例如,'[a-z]'可以匹配'a'到'z' 范圍內的任意小寫字母字符
 
[^a-z]
 負值字符范圍。匹配不在指定范圍內的任意字符。例如,'[^a-z]'可以匹配不在'a' 到'z'范圍內的任意字符
 
以下是幾個簡單的正則表達式的例子:
●'[A-Za-z0-9] ':表示所有的大寫字母、小寫字母及0到9的數字。
●'^hello':表示以hello開始的字符串。
●'world$':表示以world結尾的字符串。
●'.at':表示以除"n"外的任意單個字符開頭並以"at"結尾的字符串,如"cat"、"nat"等。
●'^[a-zA-Z]':表示一個以字母開頭的字符串。
●'hi{2}':表示字母h後跟著兩個i即hii。
●'(go)+':表示至少含有一個'go'字符串的字符串,如'gogo'
身份證號碼一般由18位數字或17位數字後面加一個X或Y字母組成,要匹配身份證號碼,可以寫作:
^[0-9]{17}([0-9]|X|Y)$
Email地址的正則表達式可以寫作:
^[a-zA-Z0-9-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$
2.字符串的匹配
ereg()和eregi()函數
使用ereg()函數可以查找字符串與子字符串匹配的情況,並返回匹配字符串的長度,還可以借助參數返回匹配字符的數組。語法格式如下:
int ereg(string ($pattern) , string $string [, array $regs ])
復制代碼 代碼如下:

<?php教程
/*本例檢查字符串是否是ISO格式的日期(YYYY-MM-DD) */
$date="1988-08-09";
$len=ereg ('([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})', $date, $regs);//日期格式為YYYY-MM-DD
if ($len)
{
echo "$regs[3].$regs[2].$regs[1]". "<br>"; //輸出"09.08.1988"
echo $regs[0] ."<br>"; //輸出"1988-08-09"
echo $len; //輸出10
}
else
{
echo "錯誤的日期格式: $date";
}
?>

首頁 1 2 3 末頁

copyright © 萬盛學電腦網 all rights reserved