php正則教程
A. php 正則表達式總結
PHP 正則表達式總結
1.PHP中兩個常用的正則函數
a.preg_match 正則函數,以perl語言為基礎
語法:preg_match( mode,string subject,array matches)
說明:mode參數---- 正則的模塊,也就是正則表達式(語法)
subject參數---- 正則的內容
matches參數---- 正則的結果(獲得一個數組的形式)
b.ereg 正則函數,以POSIX基礎(Unix、Script)
語法:ereg(mode ,string subject, array regs)
2.正則表達式中包括的元素
a.原子(普通字元:a-z A-Z 0-9 、原子表、轉義字元)
b.元字元(有特殊功能的字元,如:# 、*)
c.模式修正符(系統內置部分字元 i、m、S、U ...)
3.正則表達式中的「原子」
a.a-z A-Z _ 0-9 //最常見的字元
b.(abc)(skd) //用圓括弧包含起來的單元符號(一個整體)
c.[abcs][^abd] //用方括弧包含的原子表,原子表中的^代表排除或相反的內容
d.轉義字元
d 包含所有的數字[0-9]
D 除所有數字外[^0-9]
w 包含所有英文字元[a-z A-Z 0-9]
W 除所有英文字元外[^a-z A-Z 0-9]
s 回車,換行等
......
註明: 圓括弧 必須是整體才能匹配; 方括弧 只要是其子集,都可以匹配(內容存在)
4.正則表達式元字元
* 匹配前一個內容的0次1次或多次
. 匹配內容的0次1次或多次,但不包含回車換行(代指自己,任何內容)
+ 匹配前一個內容的1次或多次
? 匹配前一個內容的.0次或1次
| 選擇匹配類似PHP中的| (因為這個運算符合是弱類型導致前面最為整體匹配,類似一個單詞匹配)
^ 匹配字元串首部內容
$ 匹配字元串尾部內容
b 匹配單詞邊界,邊界可以是空格或者特殊符合(有單詞分界符,類似空格)
B 匹配除帶單詞邊界意外內容(無單詞分界符)
{m} 匹配前一個內容的重復次數為M次
{m,} 匹配前一個內容的重復次數大於等於M次
{m,n} 匹配前一個內容的重復次數M次到N次
( ) 合並整體匹配,並放入內存,可使用1 2…依次獲取 (調用放入內存中的內容)
5.運算順序
依然遵循從左到→右的運算規則
優先順序:
( ) 圓括弧因為是內存處理所以最高
* ? + { } 重復匹配內容其次
^ $ b 邊界處理第三
| 條件處理第四
最後按照運算順序計算匹配
6.模式修正符
模式修正符是為正則表達式增強和補充的一個功能,使用在正則之外 例如:/ 正則 / U
常用修正符:
i 正則內容在匹配時候不區分大小寫(默認是區分的)
m 在匹配首內容或者尾內容時候採用多行識別匹配
s 將轉義回車取消是為單行匹配如. 匹配的時候
x 忽略正則中的空白
A 強制從頭開始匹配
D 強制$匹配尾部無任何內容 n
U 禁止貪婪匹配 只跟蹤到最近的一個匹配符並結束, 常用在採集程序上的正則表達式
7.匹配功能
preg_match_all 全部匹配函數
語法:preg_match_all ( string pattern, string subject, array matches [, int flags] )
說明:對結果排序使 $matches[0] 為全部模式匹配的數
用途:截取比較詳細的內容,採集網頁,分析文本
8.替換功能
preg_replace 正則替換函數
語法:preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
說明:通過正則表達式來替換相關內容,類似之前學過的str_replace字元串替換,但 功能要強於它
提示:1、替換內容可以是一個正則也可以是數組正則
2、替換內容可以通過修正符e來解決替換執行內容
用途:替換一些比較復雜的內容上,也可以用於內容的轉換上
9.分割功能
preg_split 正則切割
語法:preg_split ( string pattern, string subject [, int limit [, int flags]] )
說明:通過正則表達式來切割相關內容,類似之前學過的explode切割函數,但explode 只能按照一種方式切割有局限性。
;B. 正則表達式 PHP
{}中不能使用反向引用,至少不能直接使用,有沒有其他使用方法不祥(可能性比較小)
建議解決方式:
使用如下正則以及判斷
$str="5aaaaa";
$ret=preg_match("/^(\d)(\w)\\2*$/",$str,$phones);
if($ret==1)
{
if($phones[1]==strlen($phones[0])-1)
{
echo('true');
}
else
{
echo('false1');
}
}
else
{
echo('false2');
}
說明:
先用正則表達式/^(\d)(\w)\\2*$/確定字元串必須為數字開頭,第二個為字元,從第二個字元開始重復直到結束
然後進行條件判斷,因為$phones[1]中存放了第一個字元,因此比較字元串長度就可以了
===========================================
補充:
如果你的這個字元串需要從某個大的正則表達式中的匹配,那麼我建議你用括弧把這個字元串匹配到的結果括起來做一個子模式.
例如:
$str="(5ab3de)(6cde9gh)";
$ret=preg_match("/\(((\d)\w*)\)\(((\d)\w*)\)/",$str,$phones);
print_r($phones);
這樣$phones[1]表示字元串,$phones[2]表示字元串長度,然後再做判斷.對於雜亂無章的字元串反而簡單用\w*就可以了.
C. php如何正則表達式如何換行
php正則替換換行符的方法:1、創建一個PHP示例文件;2、通過「preg_replace('//s*/', '', $str);」方式替換行符即可。
D. PHP正則表達式如何替換掉某字
<?php
$string='倚天屠龍記2019版粵語版';
$pattern='/版$/';
$replacement='';
echopreg_replace($pattern,$replacement,$string);
?>
$pattern='/版$/';正則表達式,匹配最後一個字是版.匹配第一個'版'。'/版/'。匹配所有的版'/版/g'。
$replacement='';用來替換的內容,去掉就是替換為空字元串。
更多需求查看php正則表達式教程網頁鏈接
E. php正則表達式 怎樣從後面開始匹配
這頭尾兩個斜杠/是正則表達式的限定符,這是perl正則的標准,而php支持的正則表達式就是perl正則的規范。表示兩個斜杠之間就是正則內容,在結尾斜杠後面可以開啟匹配的模式,例如:/^[\w\x80-\xff]{3,15}$/i
,後面的
i
就是忽略大小寫匹配。
F. php 正則表達式 怎麼匹配</div>第一次出現的位置
PHP正則表達式可以匹配</div>第一次出現的位置,但是PHP還有strpos和strripos兩個函數可以搜索</div>在字元串第一次出現的位置,其中strripos是搜索時不區分大小寫的搜索函數.因此,我給你個例子,並且把三種方法都列出來,你看看吧.
<?php
$str = "<div>asfdwqreqw</div>safqwfe";
$pattern = '/<\/div>/i';
preg_match_all($pattern, $str, $matches,PREG_OFFSET_CAPTURE);
print_r($matches[0][0][1]."<br/>");
$s_start=strpos($str,"</div>");
print_r($s_start."<br/>");
$s_start_1=strripos($str,"</DIV>");
print_r($s_start_1);
?>
運行結果:
15
15
15
G. php preg_match_all 的正則表達式的書寫方法
正則表達式的基本語法
一個正則表達式,分為三個部分:分隔符,表達式和修飾符。
分隔符可以是除了特殊字元以外的任何字元(比如"/ !"等等),常用的分隔符是"/"。表達式由一些特殊字元(特殊字元詳見下面)和非特殊的字元串組成,比如"[a-z0-9_-]+@[a-z0-9_-.]+"可以匹配一個簡單爛正的電子郵件字元串。修飾符是用來開啟或者關閉某種功能/模式。下面就是一個完整的正則表達式的例子:
/hello.+?hello/is
上面的正則表達式"/"就是分隔符,兩個"/"之間的就是表達式,第二個"/"後面的字元串"is"就是修飾符。
在表達式中如果含有分隔符,那麼就需要使用轉義符號"/",比如"/hello.+?//hello/is"。轉義符號除了用於分隔符外還可以執行特殊字元,全部由字母構成的特殊字元都需要"/"來轉義,比如"/d"代表全體數字。
正則表達式的特殊字元
正則表達式中的特殊字元分為元字元、定位字元等等。
元字元是正則表達式中一類有特殊意義的字元,用來描述其前導字元(即元字元前面的字元)在被匹配的對象中出現的方式。元字元本身是一個個單一的字元,但是不同或者相同的元字元組合起來可以構成大的元字元。
元字元:
大括弧:大括弧用來精確指定匹配元字元出現的次數,例如"/pre{1,5}/"表示匹配的對象可以是"pre"、"pree"、"preeeee"這樣在"pr"後面出現1個到5個"e"的字元串。或者"/pre{,5}/"代表pre出現0此到5次之間。
加號:"+"字元用來匹配元字元前的字元出現一次或者多次。例如"/ac+/"表示被匹配的對象可以是"act"、"account"、"acccc"等在"a"後面出現一個或者多個"c"的字元串。"+"相當於"{1,}"。
星號:"*"字元用來匹配元字元前的字元出現零次或者多次。例如"/ac*/"表示被匹配的對象可以是"app"、"acp"、"accp"等在"a"後面出現零個或者多個"c"的字元串。"*"相當於"{0,}"。
問號:"?"字元用來匹配元字元前的字元出現零次或者1次。例如"/ac?/"表示匹配的對象可以是"a"、"acp"、"acwp"這樣在"a"後面出現零個或者1個"c"的字元串。"?"在正則表達式中還有一個非常重要的作用,即"貪婪模式"。
還有兩個很重要的特殊字元就是"[ ]"。他們可以匹配"[]"之中出現過的字元,比如"/[az]/"可以匹配單個字元"a"或者"z";如果把上面的表達式改成這樣"/[a-z]/",就可以匹配任何單個小寫字母,比如"a"、"b"等等。
如果在"[]"中出現了"^",代表本表達式不匹配"[]"內出現的字元,比如"/[^a-z]/"不匹配任何小寫字母!並且正則表達式給出了幾祥歷碧種"[]"的默認值:
[:alpha:]:匹配任何字母
[:alnum:]:匹配任何字母和數字
[:digit:]:匹配任何數字
[:space:]:匹配空格符
[:upper:]:匹配任何大寫字母
[:lower:]:匹配任何小寫字母
[:punct:]:匹配任何標點符號
[:xdigit:]:匹配任何16進制數字
另外下面這些特殊字元在轉義符號"/"轉義後代表的含義如下:
s:匹配單個的空格符
S:用於匹配除單個空格符之外的所有字元。
d:用於匹配從0到9的數字,相當於"/[0-9]/"。
w:用於匹配字母,數字或下劃線字元,相當於"/[a-zA-Z0-9_]/"。
W:用於匹配所有與w不匹配的字元,相當於"/[^a-zA-Z0-9_]/"。
D:用於匹配任何非10進制的數字字元。
.:用於匹配除換行符之外的所有字元,如果經過修飾符"s"的修飾,"."可以謹舉代表任意字元。
利用上面的特殊字元可以很方便的表達一些比較繁瑣的模式匹配。例如"//d0000/"利用上面的正則表達式可以匹配萬以上,十萬一下的整數字元串。
定位字元:
定位字元是正則表達式中又一類非常重要的字元,它的主要作用是用於對字元在匹配對象中的位置進行描述。
^:表示匹配的模式出現在匹配對象的開頭(和在"[]"裡面不同)
$:表示匹配的模式出現在匹配對象的末尾
空格:表示匹配的模式出現在開始和結尾的兩個邊界之一
"/^he/":可以匹配以"he"字元開頭的字元串,比如hello、height等等;
"/he$/":可以匹配以"he"字元結尾的字元串即she等;
"/ he/":空格開頭,和^的作用一樣,匹配以he開頭的字元串;
"/he /":空格結束,和$的作用一樣,匹配以he結尾的字元串;
"/^he$/":表示只和字元串"he"匹配。
正則表達式除了可以用戶匹配,還可以用括弧"()"來記錄需要的信息,儲存起來,給後面的表達式讀取。比如:
/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/
就是記錄郵件地址的用戶名,和郵件地址的伺服器地址(形式為[email protected]之類的),在後面如果想要讀取記錄下來的字元串,只是需要用"轉義符+記錄的次序"來讀取。比如"/1"就相當於第一個"[a-zA-Z0-9_-]+","/2"相當於第二個([a-zA-Z0-9_-]+),"/3"就是第三個(.[a-zA-Z0-9_-])。但是在PHP中,"/"是一個特殊的字元,需要轉義,所以""到了PHP的表達式中就應該寫成"//1"。
其他特殊符號:
"|":或符號"|"和PHP裡面的或一樣,不過是一個"|",而不是PHP的兩個"||"!意思就是可以是某個字元或者另一個字元串,比如"/abcd|dcba/"可能匹配"abcd"或者"dcba"。
貪婪模式
前面在元字元中提到過"?"還有一個重要的作用,即"貪婪模式",什麼是"貪婪模式"呢?
比如我們要匹配以字母"a"開頭字母"b"結尾的字元串,但是需要匹配的字元串在"a"後面含有很多個"b",比如"a bbbbbbbbbbbbbbbbb",那正則表達式是會匹配第一個"b"還是最後一個"b"呢?如果你使用了貪婪模式,那麼會匹配到最後一個"b",反之只是匹配到第一個"b"。
使用貪婪模式的表達式如下:
/a.+?b/
/a.+b/U
不使用貪婪模式的如下:
/a.+b/
上面使用了一個修飾符U,詳見下面的部分。
修飾符
在正則表達式裡面的修飾符可以改變正則的很多特性,使得正則表達式更加適合你的需要(注意:修飾符對於大小寫是敏感的,這意味著"e"並不等於"E")。正則表達式裡面的修飾符如下:
i :如果在修飾符中加上"i",則正則將會取消大小寫敏感性,即"a"和"A" 是一樣的。
m:默認的正則開始"^"和結束"$"只是對於正則字元串如果在修飾符中加上"m",那麼開始和結束將會指字元串的每一行:每一行的開頭就是"^",結尾就是"$"。
s:如果在修飾符中加入"s",那麼默認的"."代表除了換行符以外的任何字元將會變成任意字元,也就是包括換行符!
x:如果加上該修飾符,表達式中的空白字元將會被忽略,除非它已經被轉義。
e:本修飾符僅僅對於replacement有用,代表在replacement中作為PHP代碼。
A:如果使用這個修飾符,那麼表達式必須是匹配的字元串中的開頭部分。比如說"/a/A"匹配"abcd"。
E:與"m"相反,如果使用這個修飾符,那麼"$"將匹配絕對字元串的結尾,而不是換行符前面,默認就打開了這個模式。
U:和問號的作用差不多,用於設置"貪婪模式"。
PCRE相關的正則表達式函數
PHP的Perl兼容正則表達式提供的多個函數,分為模式匹配,替換和匹配數目等等:
1、preg_match :
函數格式:int preg_match(string pattern, string subject, array [matches]);
這個函數會在string中使用pattern表達式來匹配,如果給定了[regs],就會將string記錄到[regs][0]中,[regs][1]代表使用括弧"()"記錄下來的第一個字元串,[regs][2]代表記錄下來的第二個字元串,以此類推。preg如果在string中找到了匹配的pattern,就會返回"true",否則返回"false"。
2、preg_replace :
函數格式:mixed preg_replace(mixed pattern, mixed replacement, mixed subject);
這個函數會使用將string中符合表達式pattern的字元串全部替換為表達式replacement。如果replacement中需要包含pattern的部分字元,則可以使用"()"來記錄,在replacement中只是需要用"/1"來讀取。
3、preg_split :
函數格式:array preg_split(string pattern, string subject, int [limit]);
這個函數和函數split一樣,區別僅在與split可以使用簡單正則表達式來分割匹配的字元串,而preg_split使用完全的Perl兼容正則表達式。第三個參數limit代表允許返回多少個符合條件的值。
4、preg_grep :
函數格式:array preg_grep(string patern , array input);
這個函數和preg_match功能基本上,不過preg_grep可以將給定的數組input中的所有元素匹配,返回一個新的數組。 下面舉一個例子,比如我們要檢查Email地址的格式是否正確:
<?php
function emailIsRight($email) {
if (preg_match("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$email)) {
return 1;
}
return 0;
}
if(emailIsRight('[email protected]')) echo '正確<br>';
if(!emailIsRight('y10k@fffff')) echo '不正確<br>';
?>
上面的程序會輸出"正確<br>不正確"。
PHP中的Perl兼容正則表達式和Perl/Ereg正則表達式的區別
雖然叫做「Perl兼容正則表達式」,但是和Perl的正則表達式相比,PHP的還是由一些不同,比如修飾符「G」在Perl裡面代表全部匹配,但是在PHP中沒有加入對這個修飾符的支持。
還有就是和ereg系列函數的區別,ereg也是PHP中提供的正則表達式函數,不過和preg相比,要弱上很多。
1、ereg裡面是不需要也不能使用分隔符和修飾符的,所以ereg的功能比preg要弱上不少。
2、關於".":點在正則裡面一般是除了換行符以外的全部字元,但是在ereg裡面的"."是任意字元,即包括換行符!如果在preg裡面希望"."能夠包括換行符,可以在修飾符中加上"s"。
3、ereg默認使用貪婪模式,並且不能修改,這個給很多替換和匹配帶來麻煩。
4、速度:這個或許是很多人關心的問題,會不會preg功能強大是以速度來換取的?不用擔心,preg的速度要遠遠比ereg快,筆者做了一個程序測試:
<?php
echo "Preg_replace used time:";
$start = time();
for($i=1;$i<=100000;$i++) {
$str = "ssssssssssssssssssssssssssss";
preg_replace("/s/","",$str);
}
$ended = time()-$start;
echo $ended;
echo "ereg_replace used time:";
$start = time();
for($i=1;$i<=100000;$i++) {
$str = "ssssssssssssssssssssssssssss";
ereg_replace("s","",$str);
}
$ended = time()-$start;
echo $ended;
echo "str_replace used time:";
$start = time();
for($i=1;$i<=100000;$i++) {
$str = "sssssssssssssssssssssssssssss";
str_replace("s","",$str);
}
$ended = time()-$start;
echo $ended;
?>
結果:
Preg_replace used time:5
ereg_replace used time:15
str_replace used time:2
str_replace因為不需要匹配所以速度非常快,而preg_replace的速度比ereg_replace要快上不少。
關於PHP3.0對於preg的支持
在PHP 4.0中默認加入了preg支持,但是在3.0中確沒有。如果在3.0中希望使用preg函數,必須載入php3_pcre.dll文件,只要在php.ini的extension部分設置加入"extension = php3_pcre.dll"然後從新啟動PHP就可以了!
其實正則表達式還常用於UbbCode的實現,很多PHP論壇都使用了這個方法(比如zForum zphp.com或者vB vbullent.com),但是具體的代碼比較長。
正則表達式(regular expression)描述了一種字元串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。
列目錄時,dir *.txt或ls *.txt中的*.txt就不是一個正則表達式,因為這里*與正則式的*的含義是不同的。
為便於理解和記憶,先從一些概念入手,所有特殊字元或字元組合有一個總表在後面,最後一些例子供理解相應的概念。
正則表達式
是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。正則表達式作為一個模板,將某個字元模式與所搜索的字元串進行匹配。
可以通過在一對分隔符之間放入表達式模式的各種組件來構造一個正則表達式,即/expression/
普通字元
由所有那些未顯式指定為元字元的列印和非列印字元組成。這包括所有的大寫和小寫字母字元,所有數字,所有標點符號以及一些符號。
非列印字元
字元 含義
/cx 匹配由x指明的控制字元。例如, /cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字元。
/f 匹配一個換頁符。等價於 /x0c 和 /cL。
/n 匹配一個換行符。等價於 /x0a 和 /cJ。
/r 匹配一個回車符。等價於 /x0d 和 /cM。
/s 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ /f/n/r/t/v]。
/S 匹配任何非空白字元。等價於 [^ /f/n/r/t/v]。
/t 匹配一個製表符。等價於 /x09 和 /cI。
/v 匹配一個垂直製表符。等價於 /x0b 和 /cK。
特殊字元
所謂特殊字元,就是一些有特殊含義的字元,如上面說的"*.txt"中的*,簡單的說就是表示任何字元串的意思。如果要查找文件名中有*的文件,則需要對*進行轉義,即在其前加一個/。ls /*.txt。正則表達式有以下特殊字元。
特別字元 說明
$ 匹配輸入字元串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '/n' 或 '/r'。要匹配 $ 字元本身,請使用 /$。
( ) 標記一個子表達式的開始和結束位置。子表達式可以獲取供以後使用。要匹配這些字元,請使用 /( 和 /)。
* 匹配前面的子表達式零次或多次。要匹配 * 字元,請使用 /*。
+ 匹配前面的子表達式一次或多次。要匹配 + 字元,請使用 /+。
. 匹配除換行符 /n之外的任何單字元。要匹配 .,請使用 /。
[ 標記一個中括弧表達式的開始。要匹配 [,請使用 /[。
? 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字元,請使用 /?。
/ 將下一個字元標記為或特殊字元、或原義字元、或向後引用、或八進制轉義符。例如, 'n' 匹配字元 'n'。'/n' 匹配換行符。序列 '//' 匹配 "/",而 '/(' 則匹配 "("。
^ 匹配輸入字元串的開始位置,除非在方括弧表達式中使用,此時它表示不接受該字元集合。要匹配 ^ 字元本身,請使用 /^。
{ 標記限定符表達式的開始。要匹配 {,請使用 /{。
| 指明兩項之間的一個選擇。要匹配 |,請使用 /|。
構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多種元字元與操作符將小的表達式結合在一起來創建更大的表達式。正則表達式的組件可以是單個的字元、字元集合、字元范圍、字元間的選擇或者所有這些組件的任意組合。
限定符
限定符用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配。有*或+或?或{n}或{n,}或{n,m}共6種。
*、+和?限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的後面加上一個?就可以實現非貪婪或最小匹配。
正則表達式的限定符有:
字元 描述
* 匹配前面的子表達式零次或多次。例如,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?'。請注意在逗號和兩個數之間不能有空格。
定位符
用來描述字元串或單詞的邊界,^和$分別指字元串的開始與結束,/b描述單詞的前或後邊界,/B表示非單詞邊界。不能對定位符使用限定符。
選擇
用圓括弧將所有選擇項括起來,相鄰的選擇項之間用|分隔。但用圓括弧會有一個副作用,是相關的匹配會被緩存,此時可用?:放在第一個選項前來消除這種副作用。
其中?:是非捕獲元之一,還有兩個非捕獲元是?=和?!,這兩個還有更多的含義,前者為正向預查,在任何開始匹配圓括弧內的正則表達式模式的位置來匹配搜索字元串,後者為負向預查,在任何開始不匹配該正則表達式模式的位置來匹配搜索字元串。
後向引用
對一個正則表達式模式或部分模式兩邊添加圓括弧將導致相關匹配存儲到一個臨時緩沖區中,所捕獲的每個子匹配都按照在正則表達式模式中從左至右所遇到的內容存儲。存儲子匹配的緩沖區編號從 1 開始,連續編號直至最大 99 個子表達式。每個緩沖區都可以使用 '/n' 訪問,其中 n 為一個標識特定緩沖區的一位或兩位十進制數。
可以使用非捕獲元字元 '?:', '?=', or '?!' 來忽略對相關匹配的保存。
各種操作符的運算優先順序
相同優先順序的從左到右進行運算,不同優先順序的運算先高後低。各種操作符的優先順序從高到低如下:
操作符 描述
/ 轉義符
(), (?:), (?=), [] 圓括弧和方括弧
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, /anymetacharacter 位置和順序
| 「或」操作
全部符號解釋
字元 描述
/ 將下一個字元標記為一個特殊字元、或一個原義字元、或一個 向後引用、或一個八進制轉義符。例如,'n' 匹配字元 "n"。'/n' 匹配一個換行符。序列 '//' 匹配 "/" 而 "/(" 則匹配 "("。
^ 匹配輸入字元串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 '/n' 或 '/r' 之後的位置。
$ 匹配輸入字元串的結束位置。如果設置了RegExp 對象的 Multiline 屬性,$ 也匹配 '/n' 或 '/r' 之前的位置。
* 匹配前面的子表達式零次或多次。例如,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 並獲取這一匹配。所獲取的匹配可以從產生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 $0…$9 屬性。要匹配圓括弧字元,請使用 '/(' 或 '/)'。
(?:pattern) 匹配 pattern 但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以後使用。這在使用 "或" 字元 (|) 來組合一個模式的各個部分是很有用。例如, 'instr(?:y|ies) 就是一個比 'instry|instries' 更簡略的表達式。
(?=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' 范圍內的任意字元。
/b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er/b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
/B 匹配非單詞邊界。'er/B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
/cx 匹配由 x 指明的控制字元。例如, /cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字元。
/d 匹配一個數字字元。等價於 [0-9]。
/D 匹配一個非數字字元。等價於 [^0-9]。
/f 匹配一個換頁符。等價於 /x0c 和 /cL。
/n 匹配一個換行符。等價於 /x0a 和 /cJ。
/r 匹配一個回車符。等價於 /x0d 和 /cM。
/s 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ /f/n/r/t/v]。
/S 匹配任何非空白字元。等價於 [^ /f/n/r/t/v]。
/t 匹配一個製表符。等價於 /x09 和 /cI。
/v 匹配一個垂直製表符。等價於 /x0b 和 /cK。
/w 匹配包括下劃線的任何單詞字元。等價於'[A-Za-z0-9_]'。
/W 匹配任何非單詞字元。等價於 '[^A-Za-z0-9_]'。
/xn 匹配 n,其中 n 為十六進制轉義值。十六進制轉義值必須為確定的兩個數字長。例如,'/x41' 匹配 "A"。'/x041' 則等價於 '/x04' & "1"。正則表達式中可以使用 ASCII 編碼。.
/num 匹配 num,其中 num 是一個正整數。對所獲取的匹配的引用。例如,'(.)/1' 匹配兩個連續的相同字元。
/n 標識一個八進制轉義值或一個向後引用。如果 /n 之前至少 n 個獲取的子表達式,則 n 為向後引用。否則,如果 n 為八進制數字 (0-7),則 n 為一個八進制轉義值。
/nm 標識一個八進制轉義值或一個向後引用。如果 /nm 之前至少有 nm 個獲得子表達式,則 nm 為向後引用。如果 /nm 之前至少有 n 個獲取,則 n 為一個後跟文字 m 的向後引用。如果前面的條件都不滿足,若 n 和 m 均為八進制數字 (0-7),則 /nm 將匹配八進制轉義值 nm。
/nml 如果 n 為八進制數字 (0-3),且 m 和 l 均為八進制數字 (0-7),則匹配八進制轉義值 nml。
/un 匹配 n,其中 n 是一個用四個十六進制數字表示的 Unicode 字元。例如, /u00A9 匹配版權符號 (?)。
我又一個正則表達式教程上的東西,粘下來給你看,雖然看著挺多,但是很快能看完。裡面說的已經挺詳細的了,正則表達式其實說簡單很簡單,拿來就用,說復雜也復雜,規則不少,導致應用時變化也很多
H. PHP如何運用正則表達式更改日期
先正則找到日期字元串(中文的日期不行),然後用strtotime得到時間戳,利用改時間戳再次調用strtotime即可。
sample:
$str
=
"date:2012/01/01";
$reg
=
"/:(?<date>.*$)/";
preg_match($reg,
$str,
$match);
$time
=
date("Y-m-d",strtotime('yesterday',
strtotime($match['date'])));
var_mp($time);