當前位置:首頁 » 編程語言 » phpaz

phpaz

發布時間: 2022-09-24 17:19:06

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

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

❷ 在think PHP3.2.3如何將數值轉換為Excel對應的字母列號,例如1對應A,2對應B,27對應AA,

前面加個$i=1,然後再去循環,後面加個$i++,這樣就可以了,這樣出來的就是1開頭的了,希望對你有用。

❸ php下將多個數組合並成一個數組的方法與實例代碼

1.合並數組
array_merge()函數將數組合並到一起,返回一個聯合的數組。所得到的數組以第一個輸入數組參數開始,按後面數組參數出現的順序依次迫加。其形式為:
復制代碼
代碼如下:
array
array_merge
(array
array1
array2…,arrayN)
將一個或多個數組的單元合並起來,一個數組中的值附加在前一個數組的後面。返回作為結果的數組。
如果輸入的數組中有相同的字元串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。
如果只給了一個數組並且該數組是數字索引的,則鍵名會以連續方式重新索引。
實例如下:
復制代碼
代碼如下:
$face
=
array("J","Q","K","A");
$numbered
=
array("2","3","4","5","6","7","8","9");
$cards
=
array_merge($face,
$numbered);
shuffle($cards);
print_r($cards);
這將返回如下所示的結果,運行代碼:
復制代碼
代碼如下:
Array
(
[0]
=>
A
[1]
=>
4
[2]
=>
9
[3]
=>
3
[4]
=>
K
[5]
=>
7
[6]
=>
5
[7]
=>
Q
[8]
=>
6
[9]
=>
8
[10]
=>
2
[11]
=>
J
)
2.遞歸追加數組
array_merge_recursive()函數與array_merge()相同,可以將兩個或多個數組合並在一起,形成一個聯合的數組.兩者之間的區別在於,當某個輸入數組中的某個鍵己經存在於結果數組中時該函數會採取不同的處理方式.array_merge()會覆蓋前面存在的鍵/值對,替換為當前輸入數組中的鍵/值對,而array_merge_recursive()將把兩個值合並在一起,形成一個新的數組,並以原有的鍵作為數組名。還有一個數組合並的形式,就是遞歸追加數組。其形式為:
view
sourceprint?array
array_merge_recursive(
array
key,array
values
)
示例如下:
復制代碼
代碼如下:
$class1
=
array("John"
=>
100,
"James"
=>
85);
$class2
=
array("Micky"
=>
78,
"John"
=>
45);
$classScores
=
array_merge_recursive($class1,
$class2);
print_r($classScores);
這將返回如下結果:
view
sourceprint?Array
(
[John]
=>
Array
(
[0]
=>
100
[1]
=>
45
)
[James]
=>
85
[Micky]
=>
78
)
3.連接兩個數組
array_combine()函數會得到一個新數組,它由一組提交的鍵和對應的值組成。其形式為:
view
sourceprint?array
array_merge(array
array1,array
array2[…,array
arrayN])
注意,兩個輸入數組必須大小相同,不能為空。示例如下:
復制代碼
代碼如下:
$abbreviations
=
array("AL","AK","AZ","AR");
$states
=
array("Alabama","Alaska","Arizona","Arkansas");
$stateMap
=
array_combine($abbreviations,$states);
print_r($stateMap);
這會返回:
復制代碼
代碼如下:
Array
(
[AL]
=>
Alabama
[AK]
=>
Alaska
[AZ]
=>
Arizona
[AR]
=>
Arkansas
)

❹ php 循環出來a-aa

用if判斷,
if($k<=26){
echo $k
}else {
echo 'A'.{$k}%26;
}

❺ PHP問題。。

不用PHP 用javaSCRIPT就OK了

<script type="text/javascript">
function $(){
var regUser=/^[\da-z]{0,10}$/;
var regPass=/^[\da-zA-Z]{6,15}$/;
if(regUser.test(document.forms[0].user.value) && regPass.test(document.forms[0].pass.value)){
alert('有效的數據');
}else alert('無效的數據');
return false;
}
</script>
<form onSubmit="return $()">
<input name="user" type="text">
<br>
<input name="pass" type="password" />
<button type="submit">Enter</button>
</form>

❻ PHP中static與global有區別么區別是什麼

PHP 的全局變數和 C 語言有一點點不同,在 C 語言中,全局變數在函數中自動生效,除非被局部變數覆蓋。這可能引起一些問題,有些人可能漫不經心的改變一個全局變數。PHP 中全局變數在函數中使用時必須申明為全局。
使用 global的例子
<?php
$a = 1;
$b = 2;

function Sum()
{
global $a, $b;

$b = $a + $b;
}

Sum();
echo $b;
?>
以上腳本的輸出將是 "3"。在函數中申明了全局變數 $a 和 $b,任何變數的所有引用變數都會指向到全局變數。

static 是類的變數,其值並不是像web_ajax說的那樣不能改變,使可以改變的

❼ php在數組中查詢字元串相似度並返回鍵名或者鍵值

根據傳入的字元串和數組,返回數組中相似度最高的字元串
PHP代碼如下:
1.function closest_word($input, $words) {
2. $shortest = -1;
3. foreach ($words as $word) {
4. $lev = levenshtein($input, $word);
5. if ($lev == 0) {
6. $closest = $word;
7. $shortest = 0;
8. break;
9. }
10. if ($lev <= $shortest || $shortest < 0) {
11. $closest = $word;
12. $shortest = $lev;
13. }
14. }
15. return $closest;
16.}
2. 代碼示例如下:
// 根據傳入的州名(可能客戶有輸錯),返回相似度最高的州名稱
$united_state_list = array(
'AL'=>"Alabama",
'AK'=>"Alaska",
'AZ'=>"Arizona",
'AR'=>"Arkansas",
'CA'=>"California",
'CO'=>"Colorado",
'CT'=>"Connecticut",
'DE'=>"Delaware",
'DC'=>"District Of Columbia",
'FL'=>"Florida",
'GA'=>"Georgia",
'HI'=>"Hawaii",
'ID'=>"Idaho",
'IL'=>"Illinois",
'IN'=>"Indiana",
'IA'=>"Iowa",
'KS'=>"Kansas",
'KY'=>"Kentucky",
'LA'=>"Louisiana",
'ME'=>"Maine",
'MD'=>"Maryland",
'MA'=>"Massachusetts",
'MI'=>"Michigan",
'MN'=>"Minnesota",
'MS'=>"Mississippi",
'MO'=>"Missouri",
'MT'=>"Montana",
'NE'=>"Nebraska",
'NV'=>"Nevada",
'NH'=>"New Hampshire",
'NJ'=>"New Jersey",
'NM'=>"New Mexico",
'NY'=>"New York",
'NC'=>"North Carolina",
'ND'=>"North Dakota",
'OH'=>"Ohio",
'OK'=>"Oklahoma",
'OR'=>"Oregon",
'PA'=>"Pennsylvania",
'RI'=>"Rhode Island",
'SC'=>"South Carolina",
'SD'=>"South Dakota",
'TN'=>"Tennessee",
'TX'=>"Texas",
'UT'=>"Utah",
'VT'=>"Vermont",
'VA'=>"Virginia",
'WA'=>"Washington",
'WV'=>"West Virginia",
'WI'=>"Wisconsin",
'WY'=>"Wyoming"
);
$input_state = 'Wiscsin';
$state = closest_word($input_state ,array_values($united_state_list));
echo $state;

❽ thinkPHP怎樣使用PHPExcel導出網站數據為excel

1
一、下載PHPExcel包

2
二、新建文件夾,命名為PHPExcel,將上面兩個文件PHPExcel,PHPExcel.php放到我們新建的PHPExcel文件夾下面;然後將此文件夾放在thinkPHP核心包裡面,路徑如下:D:\***\你的項目\ThinkPHP\Library\Vendor

3
三、前端界面代碼
<div style="margin-left: 100px;margin-top: -33px;">
<form action="{:U(output)}" enctype="multipart/form-data" method="post" >
<input type="file" name="photo" />
<input type="submit" value="導出數據" style="background-color: #337AB7;color: white;">
</form>
</div>

4
四、導出表格樣式代碼
//商家表格導出模板
public function exportExcel($expTitle, $expCellName, $expTableData) {
$xlsTitle = iconv('utf-8', 'gb2312', $expTitle); //文件名稱
$fileName = '網站商家信息表' . date('_YmdHis'); //or $xlsTitle 文件名稱可根據自己情況設定
$cellNum = count($expCellName);
$dataNum = count($expTableData);
vendor("PHPExcel.PHPExcel");
$objPHPExcel = new\PHPExcel();

$cellName = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ',
'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV',
'AW', 'AX', 'AY', 'AZ');
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(22);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(22);
$objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(15);
$objPHPExcel->getActiveSheet(0)->mergeCells('A1:' . $cellName[$cellNum - 1] . '1');
//合並單元格

$objPHPExcel->getActiveSheet()->setCellValue('A1',
'網站商家信息表')->getStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
for ($i = 0; $i < $cellNum; $i++) {
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i][1]);
}
// Miscellaneous glyphs, UTF-8
for ($i = 0; $i < $dataNum; $i++) {
for ($j = 0; $j < $cellNum; $j++) {

$objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j] .
($i + 3), " ".$expTableData[$i][$expCellName[$j][0]]);
}
}
ob_end_clean(); //清除緩沖區,避免亂碼
header('pragma:public');
header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle. '.xls"');
header("Content-Disposition:attachment;filename=$fileName.xls");
//attachment新窗口列印inline本窗口列印
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
}

5
五、導出所需數據代碼
function output($begin=0, $end=0) {//導出商家信息Excel
$xlsName = "User";
$xlsCell = array(
array('userid', '商家id'),
array('groupid', '商家等級'),
array('store_name', '店鋪名稱'),
array('contact_name', '聯系人'),
array('phone', '手機'),
array('email', '郵箱'),
array('activity_count', '活動商品'),
array('frozen_deposit', '凍結中保證金'),
array('regdate', '注冊時間'),
array('loginnum', '登錄次數'),
array('lastdate', '最近登錄'),
array('id_number', '身份證號碼'),
array('name', '姓名'),
array('qq', 'QQ'), );
$beginToday = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
$endToday = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
if ($begin > 0) { $beginToday = $begin;}
if ($end > 0) {$endToday = $end;}
$xlsModel = M('member');

$xlsData=$xlsModel->query("SELECT
m.userid,m.groupid,c.store_name,c.contact_name,m.phone,m.email,c.frozen_deposit,FROM_UNIXTIME(m.regdate)
AS regdate,loginnum,FROM_UNIXTIME(m.lastdate) AS lastdate,m.qq FROM
xw_member AS m ,xw_member_merchant AS c WHERE m.modelid = 2 AND m.userid
= c.userid and (m.lastdate between $beginToday and $endToday) ORDER BY
m.userid DESC");
$dataNum = count($xlsData);
for ($i = 0; $i < $dataNum; $i++){
if ($xlsData[$i][groupid] == '1') {
$xlsData[$i][groupid] = '普通商家';
} else if ($xlsData[$i][groupid] == '2') {
$xlsData[$i][groupid] = '金牌商家';
} else if ($xlsData[$i][groupid] == '3') {
$xlsData[$i][groupid] = '白金商家';
} else if ($xlsData[$i][groupid] == '4') {
$xlsData[$i][groupid] = '鑽石商家';
}

$rs=M('member_attesta')->where("userid= '".$xlsData[$i]['userid']."'
AND type = 'identity'")->getField('infos');
$identity = string2array($rs);
$xlsData[$i]['id_number'] = $identity['id_number'];
$xlsData[$i]['name'] = $identity['name'];

$xlsData[$i]['activity_count']=
M('proct')->where(array('company_id'=>$xlsData[$i]['userid']))->count();
}
$this->exportExcel($xlsName, $xlsCell, $xlsData);
}
}

6
六、導出數據表格如下

熱點內容
光遇蘋果如何下載安卓服 發布:2024-04-20 13:40:03 瀏覽:460
半歲學編程 發布:2024-04-20 13:17:53 瀏覽:217
linux按鍵 發布:2024-04-20 13:17:52 瀏覽:832
最頂配的伺服器能容納多少ip 發布:2024-04-20 13:17:44 瀏覽:514
貸款車解壓需要什麼 發布:2024-04-20 13:14:52 瀏覽:72
安卓手機電腦怎麼切換 發布:2024-04-20 13:13:25 瀏覽:893
android交叉編譯環境 發布:2024-04-20 13:00:10 瀏覽:184
伺服器怎麼搭建中間層 發布:2024-04-20 12:40:02 瀏覽:98
如何獲取網路的賬號和密碼 發布:2024-04-20 12:34:06 瀏覽:921
安卓現在哪個品牌用得最久 發布:2024-04-20 12:00:50 瀏覽:278