導航:首頁 > 編程語言 > php正則表達式修飾符

php正則表達式修飾符

發布時間:2022-08-30 04:34:02

『壹』 php正則表達式替換時,如何直接替換成數組值.

你是想用數組中的值對應替換正則匹配的結果是吧

echopreg_replace("/#(w+)#/e",'$county['$1']',$str);

使用「e」這個正則修飾符,

它會先將字元串替換為,提示不要用「」

allcounty:$county['cn'],$county['rus'],$county['usa']

然後執行eval操作,注意一定要加上',$country['$1'],因為「e」要求替換後的字元串符合eval語法

『貳』 PHP常用正則表達式匯總

1.
^d+$"//非負整數(正整數
+
0)
2.
"^[0-9]*[1-9][0-9]*$"//正整數
3.
"^((-d+)|(0+))$"//非正整數(負整數
+
0)
4.
"^-[0-9]*[1-9][0-9]*$"//負整數
5.
"^-?d+$"//整數
6.
"^d+(.d+)?$"//非負浮點數(正浮點數
+
0)
7.
"^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$"//正浮點數
8.
"^((-d+(.d+)?)|(0+(.0+)?))$"//非正浮點數(負浮點數
+
0)
9.
"^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$"//負浮點數
10.
"^(-?d+)(.d+)?$"//浮點數
11.
"^[A-Za-z]+$"//由26個英文字母組成的字元串
12.
"^[A-Z]+$"//由26個英文字母的大寫組成的字元串
13.
"^[a-z]+$"//由26個英文字母的小寫組成的字元串
14.
"^[A-Za-z0-9]+$"//由數字和26個英文字母組成的字元串
15.
"^w+$"//由數字、26個英文字母或者下劃線組成的字元串
16.
"^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$"//email地址
17.
"^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$"//url
18.
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/
//
年-月-日
19.
/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/
//
月/日/年
20.
"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"
//Emil
21.
/^((+?[0-9]{2,4}-[0-9]{3,4}-)|([0-9]{3,4}-))?([0-9]{7,8})(-[0-9]+)?$/
//電話號碼
22.
"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"
//IP地址
23.
匹配中文字元的正則表達式:
[u4e00-u9fa5]
24.
匹配雙位元組字元(包括漢字在內):[^x00-xff]
25.
匹配空行的正則表達式:n[s|
]*r
26.
匹配HTML標記的正則表達式:/<(.*)>.*</1>|<(.*)
/>/
27.
匹配首尾空格的正則表達式:(^s*)|(s*$)
28.
匹配Email地址的正則表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
29.
匹配網址URL的正則表達式:^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
30.
匹配帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
31.
匹配國內電話號碼:(d{3}-|d{4}-)?(d{8}|d{7})?
32.
匹配騰訊QQ號:^[1-9]*[1-9][0-9]*$
33.
元字元及其在正則表達式上下文中的行為:
34.
將下一個字元標記為一個特殊字元、或一個原義字元、或一個後向引用、或一個八進制轉義符。
35.
^
匹配輸入字元串的開始位置。如果設置了
RegExp
對象的Multiline
屬性,^
也匹配
’n’

’r’
之後的位置。
36.
$
匹配輸入字元串的結束位置。如果設置了
RegExp
對象的Multiline
屬性,$
也匹配
’n’

’r’
之前的位置。
37.
*
匹配前面的子表達式零次或多次。
38.
+
匹配前面的子表達式一次或多次。+
等價於
{1,}。
39.
?
匹配前面的子表達式零次或一次。?
等價於
{0,1}。
40.
{n,}
n
是一個非負整數,至少匹配n
次。
41.
{n,m}
m

n
均為非負整數,其中n
<=
m。最少匹配
n
次且最多匹配
m
次。在逗號和兩個數之間不能有空格。

『叄』 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 匹配版權符號 (?)。

我又一個正則表達式教程上的東西,粘下來給你看,雖然看著挺多,但是很快能看完。裡面說的已經挺詳細的了,正則表達式其實說簡單很簡單,拿來就用,說復雜也復雜,規則不少,導致應用時變化也很多

『肆』 php正則表達式eregi()

PHP中的正則式使用

PHP被大量的應用於Web的後台CGI開發,通常是在用戶數據數據之後得出某種結果,但是如果用戶輸入的數據不正確,就會出現問題,比如說某人的生日是」2月30日」!那應該怎麼樣來檢驗暑假是否正確呢? 在PHP中加入了正則表達式的支持,讓我們可以十分方便的進行數據匹配。
2 什麼是正則表達式:
簡單的說,正則表達式是一種可以用於模式匹配和替換的強大工具。在幾乎所有的基於UNIX/LINUX系統的軟體工具中找到正則表達式的痕跡,例如:Perl或PHP腳本語言。此外,JavaScript這種客戶端的腳本語言也提供了對正則表達式的支持,現在正則表達式已經成為了一個通用的概念和工具,被各類技術人員所廣泛使用。
在某個Linux網站上面有這樣的話:」如果你問一下Linux愛好者最喜歡什麼,他可能會回答正則表達式;如果你問他最害怕什麼,除了繁瑣的安裝配置外他肯定會說正則表達式。」
正如上面說的,正則表達式看起來非常復雜,讓人害怕,大多數的PHP初學者都會跳過這里,繼續下面的學習,但是PHP中的正則表達式有著可以利用模式匹配找到符合條件的字元串、判斷字元串是否合乎條件或者用指定的字元串來替代符合條件的字元串等強大的功能,不學實在太可惜了……

3 正則表達式的基本語法:
一個正則表達式,分為三個部分:分隔符,表達式和修飾符。
分隔符可以是除了特殊字元以外的任何字元(比如」/ !」等等),常用的分隔符是」/」。表達式由一些特殊字元(特殊字元詳見下面)和非特殊的字元串組成,比如」[a-z0-9_-]+@[a-z0-9_-.]+」可以匹配一個簡單的電子郵件字元串。修飾符是用來開啟或者關閉某種功能/模式。下面就是一個完整的正則表達式的例子:
/hello.+?hello/is
上面的正則表達式」/」就是分隔符,兩個」/」之間的就是表達式,第二個」/」後面的字元串」is」就是修飾符。
在表達式中如果含有分隔符,那麼就需要使用轉義符號」",比如」/hello.+?/hello/is」。轉義符號除了用於分隔符外還可以執行特殊字元,全部由字母構成的特殊字元都需要」"來轉義,比如」d」代表全體數字。

4 正則表達式的特殊字元:
正則表達式中的特殊字元分為元字元、定位字元等等。
元字元是正則表達式中一類有特殊意義的字元,用來描述其前導字元(即元字元前面的字元)在被匹配的對象中出現的方式。元字元本身是一個個單一的字元,但是不同或者相同的元字元組合起來可以構成大的元字元。
元字元:
大括弧:大括弧用來精確指定匹配元字元出現的次數,例如」/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」。

5 貪婪模式:
前面在元字元中提到過」?」還有一個重要的作用,即」貪婪模式」,什麼是

『伍』 php正則表達式的修飾符,小寫u是什麼意思

一般寫在字元串前面,u是代表Unicode字元串,r代表原字元串【裡面的特殊字元不轉義,如\n不會當作換行符,就是字面的意思】

『陸』 php 正則表達式

建議你到我的網站上下載PHP5參考手冊,里邊有詳細的正則表達式的參考。
模式要有開始和結束的字元,一下都是合法的:
/
|
#
'
前提是模式中不能再出現這個字元了。
結尾的/後邊的is是模式修政府,具體如下
i (PCRE_CASELESS)
如果設定此修正符,模式中的字元將同時匹配大小寫字母。
m(PCRE_MULTILINE)
默認情況下,PCRE 將目標字元串作為單一的一「行」字元所組成的(甚至其中包含有換行符也是如此)。「行起始」元字元(^)僅僅匹配字元串的起始,「行結束」元字元($)僅僅匹配字元串的結束,或者最後一個字元是換行符時其前面(除非設定了 D 修正符)。這和 Perl 是一樣的。

當設定了此修正符,「行起始」和「行結束」除了匹配整個字元串開頭和結束外,還分別匹配其中的換行符的之後和之前。這和 Perl 的 /m 修正符是等效的。如果目標字元串中沒有「\n」字元或者模式中沒有 ^ 或 $,則設定此修正符沒有任何效果。

s(PCRE_DOTALL)
如果設定了此修正符,模式中的圓點元字元(.)匹配所有的字元,包括換行符。沒有此設定的話,則不包括換行符。這和 Perl 的 /s 修正符是等效的。排除字元類例如 [^a] 總是匹配換行符的,無論是否設定了此修正符。
x(PCRE_EXTENDED)
如果設定了此修正符,模式中的空白字元除了被轉義的或在字元類中的以外完全被忽略,在未轉義的字元類之外的 # 以及下一個換行符之間的所有字元,包括兩頭,也都被忽略。這和 Perl 的 /x 修正符是等效的,使得可以在復雜的模式中加入注釋。然而注意,這僅適用於數據字元。空白字元可能永遠不會出現於模式中的特殊字元序列,例如引入條件子模式的序列 (?( 中間。
e
如果設定了此修正符,preg_replace() 在替換字元串中對逆向引用作正常的替換,將其作為 PHP 代碼求值,並用其結果來替換所搜索的字元串。

只有 preg_replace() 使用此修正符,其它 PCRE 函數將忽略之。

注意: 本修正符在 PHP3 中不可用。

A(PCRE_ANCHORED)
如果設定了此修正符,模式被強制為「anchored」,即強制僅從目標字元串的開頭開始匹配。此效果也可以通過適當的模式本身來實現(在 Perl 中實現的唯一方法)。
D(PCRE_DOLLAR_ENDONLY)
如果設定了此修正符,模式中的美元元字元僅匹配目標字元串的結尾。沒有此選項時,如果最後一個字元是換行符的話,美元符號也會匹配此字元之前(但不會匹配任何其它換行符之前)。如果設定了 m 修正符則忽略此選項。Perl 中沒有與其等價的修正符。
S
當一個模式將被使用若干次時,為加速匹配起見值得先對其進行分析。如果設定了此修正符則會進行額外的分析。目前,分析一個模式僅對沒有單一固定起始字元的 non-anchored 模式有用。
U(PCRE_UNGREEDY)
本修正符反轉了匹配數量的值使其不是默認的重復,而變成在後面跟上「?」才變得重復。這和 Perl 不兼容。也可以通過在模式之中設定 (?U) 修正符或者在數量符之後跟一個問號(如 .*?)來啟用此選項。
X(PCRE_EXTRA)
此修正符啟用了一個 PCRE 中與 Perl 不兼容的額外功能。模式中的任何反斜線後面跟上一個沒有特殊意義的字母導致一個錯誤,從而保留此組合以備將來擴充。默認情況下,和 Perl 一樣,一個反斜線後面跟一個沒有特殊意義的字母被當成該字母本身。當前沒有其它特性受此修正符控制。
u(PCRE_UTF8)
此修正符啟用了一個 PCRE 中與 Perl 不兼容的額外功能。模式字元串被當成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起開始檢查模式的 UTF-8 合法性。

『柒』 用php正則表達式<div class="a">aaaa<div>1111</div>bbbb</div>然後用數組出兩個結果aaaabbbb和111 求解

以下答案來自團隊討論的結果。

最終答案:

<?php
/**
* 模式修飾符s,可使得.能匹配包括換行在內的任意字元
* 模式修飾符i,不區分大小寫匹配
* (?!<div.*?>.*<div.*?</div>) 負向預查排除<div中間還帶<div的情況
* <div.*?>(.*?)</div> 每次匹配一個中間不含<div的字元串
*/
$str = '<div class="a">aaaa<div>
1111</div><div>
2222<div>3333
</div></div>bbbb</div>'
$str = '<div class="a">1111<div>2222</div>3333</div><div class="a">4444<div>5555</div>6666</div><div class="a">7777<div>8888</div><div>9999</div>aaaa</div>'
$str = '<div class="a">aaaa<div>1111</div><div><span>2222</span></div>bbbb</div>'
$results = array();
while(preg_match('#(?!<div.*?>.*<div.*?</div>)<div.*?>(.*?)</div>#si',$str,$match,PREG_OFFSET_CAPTURE)){ //對中間不存在<div的字元串進行匹配,記錄偏移量
$start = $match[0][1]; //$match[0][1] 為匹配字元的起始
$end = $match[0][1]+strlen($match[0][0]); //匹配字元的起始($match[0][1])加上其長度(strlen($match[0][0]))
$str = substr($str,0,$start) . substr($str,$end); //原來$str為 substr($str,0,$start) . $match[0][0] . substr($str,$end);現在去掉中間部分。
$results[] = $match[1][0]; //$match[1][0] 小括弧匹配部分
}
echo '<pre>'
print_r($results); //匹配結果為逆序的
krsort($results); //倒序排序一下
print_r($results); //順序結果
//End_php

Zjmainstay(951086941)10:55:13
逐個往上注釋$str可以看到多個匹配情況結果


趕緊採納吧,N多人幫你做這個啊

『捌』 誰能幫我解答一下,php中正則表達式的全局修飾符、g起什麼作用,最好用一個小實例來證明一下!

替換的時候,如果沒有g,只替換第一個匹配項,有的話替換所有匹配項。

『玖』 PHP 正則表達式

([^\\.]+)\\..+

[^\\.]表示不是反斜杠\和點.的字元,([^\\.]+)中的加號表示匹配上述字元1次以上,外面的括弧表示捕獲分組,在替換中用$1表示
\\..+ \\表示反斜杠,.表示任意字元,..+表示至少2個任意字元
這個返回windows目錄結構中的第一級目錄

比如abcd\def\gh,這個正則可以匹配,前面的([^\\.]+)匹配abcd,保存在$1分組;後面\\.+匹配\def\gh
然後替換為$1,abcd\def\gh就被替換為abcd

『拾』 PHP正則表達式((:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)/is是什麼意思

(?: )表示只進行分組,不進行捕獲

[0-9a-zA-Z$_.`-] ——0-9、a-z、A-Z或$、_、.、`、-中的一個字元
| ——表示或者
[\xC2-\xDF][\x80-\xBF] ——用十六進製表示的字元范圍【具體是什麼字元不太清楚,比如漢字的范圍一般是 4E00-9FA5】
+ ——前面的字元有一個或多個
(?: +) 外面的括弧( )——是捕獲括弧。即不捕獲單個匹配字元,只捕獲匹配的最大字串。
/is——是PHP中正則表達式模式修飾符,其中i代表 不區分大小寫,s代表:如果設定了這個修正符,那麼,被匹配的字元串將視為一行來看,包括換行符,換行符將被視為普通字元串。
模式修飾符還有:m、x、e等

閱讀全文

與php正則表達式修飾符相關的資料

熱點內容
路由器搭橋遠端伺服器地址是什麼 瀏覽:515
編譯動態庫時會連接依賴庫嗎 瀏覽:706
淘寶手機加密是隨機的嗎 瀏覽:672
解壓包子怎麼裝飾 瀏覽:585
四個數湊24演算法 瀏覽:676
哪一種不是vi編譯器的模式 瀏覽:168
xp在此處打開命令窗口 瀏覽:128
代碼編譯運行用什麼軟體 瀏覽:997
動態庫在程序編譯時會被連接到 瀏覽:760
python超簡單編程 瀏覽:259
獲取命令方 瀏覽:976
怎樣製作文件夾和圖片 瀏覽:60
調研編譯寫信息 瀏覽:861
python馮諾依曼 瀏覽:419
同時安裝多個app有什麼影響 瀏覽:254
奧術殺戮命令宏 瀏覽:184
用sdes加密明文字母e 瀏覽:361
單片機原理及應用試題 瀏覽:425
易語言開啟指定文件夾 瀏覽:40
馬思純參加密室大逃脫 瀏覽:322