中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

如何在php中正確的使用正則表達(dá)式-創(chuàng)新互聯(lián)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何在php中正確的使用正則表達(dá)式,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

10年積累的成都做網(wǎng)站、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有荊州免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

前言

正則表達(dá)式是煩瑣的,但是強(qiáng)大的,學(xué)會(huì)之后的應(yīng)用會(huì)讓你除了提高效率外,會(huì)給你帶來絕對(duì)的成就感。只要認(rèn)真去閱讀這些資料,加上應(yīng)用的時(shí)候進(jìn)行一定的參考,掌握正則表達(dá)式不是問題。


 1. 引子

目前,正則表達(dá)式已經(jīng)在很多軟件中得到廣泛的應(yīng)用,包括*nix(Linux, Unix等),HP等操作系統(tǒng),PHP,C#,Java等開發(fā)環(huán)境,以及很多的應(yīng)用軟件中,都可以看到正則表達(dá)式的影子。

正則表達(dá)式的使用,可以通過簡(jiǎn)單的辦法來實(shí)現(xiàn)強(qiáng)大的功能。為了簡(jiǎn)單有效而又不失強(qiáng)大,造成了正則表達(dá)式代碼的難度較大,學(xué)習(xí)起來也不是很容易,所以需要付出一些努力才行,入門之后參照一定的參考,使用起來還是比較簡(jiǎn)單有效的。

    例子: ^.+@.+\\..+$

這樣的代碼曾經(jīng)多次把我自己給嚇退過??赡芎芏嗳艘彩潜贿@樣的代碼給嚇跑的吧。繼續(xù)閱讀本文將讓你也可以自由應(yīng)用這樣的代碼。

注意:這里的第7部分跟前面的內(nèi)容看起來似乎有些重復(fù),目的是把前面表格里的部分重新描述了一次,目的是讓這些內(nèi)容更容易理解。

2. 正則表達(dá)歷史
正則表達(dá)式的“祖先”可以一直上溯至對(duì)人類神經(jīng)系統(tǒng)如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經(jīng)生理學(xué)家研究出一種數(shù)學(xué)方式來描述這些神經(jīng)網(wǎng)絡(luò)。

1956 年, 一位叫 Stephen Kleene 的數(shù)學(xué)家在 McCulloch 和 Pitts 早期工作的基礎(chǔ)上,發(fā)表了一篇標(biāo)題為“神經(jīng)網(wǎng)事件的表示法”的論文,引入了正則表達(dá)式的概念。正則表達(dá)式就是用來描述他稱為“正則集的代數(shù)”的表達(dá)式,因此采用“正則表達(dá)式”這個(gè)術(shù)語(yǔ)。

隨后,發(fā)現(xiàn)可以將這一工作應(yīng)用于使用 Ken Thompson 的計(jì)算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要發(fā)明人。正則表達(dá)式的第一個(gè)實(shí)用應(yīng)用程序就是 Unix 中的 qed 編輯器。

如他們所說,剩下的就是眾所周知的歷史了。從那時(shí)起直至現(xiàn)在正則表達(dá)式都是基于文本的編輯器和搜索工具中的一個(gè)重要部分。


3. 正則表達(dá)式定義

正則表達(dá)式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個(gè)串是否含有某種子串、將匹配的子串做替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。

        列目錄時(shí), dir *.txt或ls *.txt中的*.txt就不是一個(gè)正則表達(dá)式,因?yàn)檫@里*與正則式的*的含義是不同的。

正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為元字符)組成的文字模式。正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。
3.1 字符

  1、普通字符:

           由所有那些未顯式指定為元字符的打印和非打印字符組成。這包括所有的大寫和小寫字母字符,所有數(shù)字,所有標(biāo)點(diǎn)符號(hào)以及一些符號(hào)。

  2、非打印字符:
字符  含義
\cx  匹配由x指明的控制字符。例如, \cM 匹配一個(gè) Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個(gè)原義的 'c' 字符。
\f  匹配一個(gè)換頁(yè)符。等價(jià)于 \x0c 和 \cL。
\n  匹配一個(gè)換行符。等價(jià)于 \x0a 和 \cJ。
\r  匹配一個(gè)回車符。等價(jià)于 \x0d 和 \cM。
\s  匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ \f\n\r\t\v]。
\S  匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。
\t  匹配一個(gè)制表符。等價(jià)于 \x09 和 \cI。
\v  匹配一個(gè)垂直制表符。等價(jià)于 \x0b 和 \cK。


3、元字符(特殊字符):

所謂元字符(特殊字符),就是一些有特殊含義的字符,如上面說的"*.txt"中的*,簡(jiǎn)單的說就是表示任何字符串的意思。如果要查找文件名中有*的文件,則需要對(duì)*進(jìn)行轉(zhuǎn)義,即在其前加一個(gè)\。ls \*.txt。正則表達(dá)式有以下特殊字符。

          要在正則表達(dá)式模式中包含元字符以使其不具有特殊含義,您必須使用反斜杠 (\) 轉(zhuǎn)義字符。例如,下面的正則表達(dá)式與順序依次為字母 A、字母 B、星號(hào)和字母 C 的模式匹配:

         /AB\*C/;
元字符  說明
$  匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,請(qǐng)使用 \$。
( )  標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置。子表達(dá)式可以獲取供以后使用。要匹配這些字符,請(qǐng)使用 \( 和 \)。
*  匹配前面的子表達(dá)式零次或多次。要匹配 * 字符,請(qǐng)使用 \*。
+  匹配前面的子表達(dá)式一次或多次。要匹配 + 字符,請(qǐng)使用 \+。
.  匹配除換行符 \n之外的任何單字符。要匹配 .,請(qǐng)使用 \。
[  標(biāo)記一個(gè)中括號(hào)表達(dá)式的開始。要匹配 [,請(qǐng)使用 \[。
?  匹配前面的子表達(dá)式零次或一次,或指明一個(gè)非貪婪限定符。要匹配 ? 字符,請(qǐng)使用 \?。
\  將下一個(gè)字符標(biāo)記為或特殊字符、或原義字符、或向后引用、或八進(jìn)制轉(zhuǎn)義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。
^  匹配輸入字符串的開始位置,除非在方括號(hào)表達(dá)式中使用,此時(shí)它表示不接受該字符集合。要匹配 ^ 字符本身,請(qǐng)使用 \^。
{  標(biāo)記限定符表達(dá)式的開始。要匹配 {,請(qǐng)使用 \{。
|  指明兩項(xiàng)之間的一個(gè)選擇。要匹配 |,請(qǐng)使用 \|。

          構(gòu)造正則表達(dá)式的方法和創(chuàng)建數(shù)學(xué)表達(dá)式的方法一樣。也就是用多種元字符與操作符將小的表達(dá)式結(jié)合在一起來創(chuàng)建更大的表達(dá)式。正則表達(dá)式的組件可以是單個(gè)的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。

4、限定符:

        限定符用來指定正則表達(dá)式的一個(gè)給定組件必須要出現(xiàn)多少次才能滿足匹配。有*或+或?或{n}或{n,}或{n,m}共6種。
*、+和?限定符都是貪婪的,因?yàn)樗鼈儠?huì)盡可能多的匹配文字,只有在它們的后面加上一個(gè)?就可以實(shí)現(xiàn)非貪婪或最小匹配。
正則表達(dá)式的限定符有:

字符  描述
*  匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價(jià)于{0,}。
+  匹配前面的子表達(dá)式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價(jià)于 {1,}。
?  匹配前面的子表達(dá)式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價(jià)于 {0,1}。
{n}  n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個(gè) o。
{n,}  n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價(jià)于 'o+'。'o{0,}' 則等價(jià)于 'o*'。
{n,m}  m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個(gè) o。'o{0,1}' 等價(jià)于 'o?'。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格?!?/p>

 5、定界符:邊界

       用來描述字符串或單詞的邊界,^和$分別指字符串的開始與結(jié)束,\b描述單詞的前或后邊界,\B表示非單詞邊界。不能對(duì)定位符使用限定符。
3.2 字符類[ ]

        可以使用字符類指定字符列表以匹配正則表達(dá)式中的一個(gè)位置。使用方括號(hào)([ 和 ])定義字符類。例如,下面的正則表達(dá)式定義了匹配 bag、beg、big、bog 或 bug 的字符類:
    /b[aeiou]g/
1、字符類中的轉(zhuǎn)義序列:
        通常在正則表達(dá)式中具有特殊含義的大多數(shù)元字符和元序列在字符類中“不具有”那些特殊含義。例如,在正則表達(dá)式中星號(hào)用于表示重復(fù),但是出現(xiàn)在字符類中時(shí)則不具有此含義。下列字符類匹配星號(hào)本身以及列出的任何其它字符:
       /[abc*123]/
       但是,下表中列出的三個(gè)字符功能與元字符相同,在字符類中具有特殊含義:

   ]    :定義字符類的結(jié)尾。
   -   :定義字符范圍

   \    :定義元序列并撤銷元字符的特殊含義。
對(duì)于要識(shí)別為字面字符(無(wú)特殊元字符含義)的任何字符,必須在該字符前面加反斜杠轉(zhuǎn)義字符。 例如,下面的正則表達(dá)式包含匹配四個(gè)符號(hào)($、\、] 或 -)中任意一個(gè)符號(hào)的字符類。
/[$\\\]\-]/

2、字符類中字符的范圍:
       使用連字符指定字符的范圍,例如 A-Z、a-z 或 0-9。這些字符必須在字符類中構(gòu)成有效的范圍。例如,下面的字符類匹配 a-z 范圍內(nèi)的任何一個(gè)字符或任何數(shù)字:
/[a-z0-9]/
      您還可以使用 \xnn ASCII 字符代碼通過 ASCII 值指定范圍。例如,下面的字符類匹配擴(kuò)展 ASCII 字符集中的任意字符 (如 é 和 ê):
/[\x80-\x9A]/

3、反轉(zhuǎn)的字符類:
       如果在字符類的開頭使用尖號(hào) (^) 字符,則將反轉(zhuǎn)該集合的意義,即未列出的任何字符都認(rèn)為匹配。下面的字符類匹配除小寫字母 (a-z) 或數(shù)字以外的任何字符:
       /[^a-z0-9]/
     必須在字符類的“開頭”鍵入尖號(hào) (^) 字符以表示反轉(zhuǎn)。否則,您只是將尖號(hào)字符添加到字符類的字符中。例如,下面的字符類匹配許多符號(hào)字符中的任意一個(gè),其中包括尖號(hào):
      /[!.,#+*%$&^]/
3.3 分組和選擇

用圓括號(hào)將所有選擇項(xiàng)括起來,相鄰的選擇項(xiàng)之間用|分隔。但用圓括號(hào)會(huì)有一個(gè)副作用,是相關(guān)的匹配會(huì)被緩存,此時(shí)可用?:放在第一個(gè)選項(xiàng)前來消除這種副作用。
其中?:是非捕獲元之一,還有兩個(gè)非捕獲元是?=和?!,這兩個(gè)還有更多的含義,前者為正向預(yù)查,在任何開始匹配圓括號(hào)內(nèi)的正則表達(dá)式模式的位置來匹配搜索字符串,后者為負(fù)向預(yù)查,在任何開始不匹配該正則表達(dá)式模式的位置來匹配搜索字符串。

          例如: /(very)+/ 可以匹配very googd或者very very good

1、后向引用(逆向引用):

如果在模式中定義標(biāo)準(zhǔn)括號(hào)組,則之后可以在正則表達(dá)式中引用它。這稱為“逆向引用”,并且此類型的組稱為 “捕獲組”。

         對(duì)一個(gè)正則表達(dá)式模式或部分模式兩邊添加圓括號(hào)將導(dǎo)致相關(guān)匹配存儲(chǔ)到一個(gè)臨時(shí)緩沖區(qū)中,所捕獲的每個(gè)子匹配都按照在正則表達(dá)式模式中從左至右所遇到的內(nèi)容存儲(chǔ)。存儲(chǔ)子匹配的緩沖區(qū)編號(hào)從 1 開始,連續(xù)編號(hào)直至較大 99 個(gè)子表達(dá)式。每個(gè)緩沖區(qū)都可以使用 '\n' 訪問,其中 n 為一個(gè)標(biāo)識(shí)特定緩沖區(qū)的一位或兩位十進(jìn)制數(shù)。
例如,在下面的正則表達(dá)式中,序列 \1 匹配在捕獲括號(hào)組中匹配的任意子字符串:
            /(\d+)-by-\1/;   // 匹配字符串:48-by-48
         可以通過鍵入 \1, \2,..., \99 在正則表達(dá)式中指定最多 99 個(gè)此類逆向引用。

        可以使用非捕獲元字符 '?:', '?=', or '?!' 來忽略對(duì)相關(guān)匹配的保存。

2、使用非捕獲組和向前查找組:
      非捕獲組是只用于分組的組,它不會(huì)被“收集” ,也不會(huì)匹配有限的逆向引用??梢允褂?(?:和 ?!) 來定義非捕獲組,如下所示:
       /(?:com|org|net);
     例如,注意在捕獲組和非捕獲組中加入 (com|org) 的區(qū)別(使用php來演示):

     捕獲組) :


復(fù)制代碼 代碼如下:


    $pattern = '/(\w+)@(\w+).(com|org)/'; 
    $str = "bob@example.com"; 
    preg_match($pattern, $str, $match); 
    print_r($match);



Array
(
    [0] => bob@example.com
    [1] => bob
    [2] => example
    [3] => com
)

       非捕獲組) :


復(fù)制代碼 代碼如下:


    $pattern = '/(\w+)@(\w+).(?:com|org)/'; 
    $str = "bob@example.com"; 
    preg_match($pattern, $str, $match); 
    print_r($match);



  Array
(
    [0] => bob@example.com
    [1] => bob
    [2] => example
)
         一類特殊的非捕獲組是 “向前查找組” ,它包括兩種類型: “正向前查找組”和 “負(fù)向前查找組” 。  使用 (?= 和?!) 定義正向前查找組,它指定組中的子模式位置必須匹配。但是,匹配正向前查找組的字符串部分可能匹配正則表達(dá)式中的剩余模式。例如,由于 (?=e) 在下列代碼中是正向前查找組,它匹配的字符 e 可以被正則表達(dá)式的后續(xù)部分匹配,在本例中為捕獲組 \w*):

復(fù)制代碼 代碼如下:


      $pattern = '/sh(?=e)(\w*)/i'; 
    $str = "Shelly sells seashells by the seashore"; 
    preg_match($pattern, $str, $match); 
    print_r($match); 


Array
(
    [0] => Shelly
    [1] => elly
)

      使用 (?! 和) 定義負(fù)向前查找組,它指定該組中的子模式位置必須不匹配。例如:

       模式:$pattern = '/sh(?!e)(\w*)/i';
Array
(
    [0] => shore
    [1] => ore
)
3.2 模式修正標(biāo)志符

如何在php中正確的使用正則表達(dá)式

此外還有:

U: 表示PCRE_UNGREEDY,表示非貪婪,相當(dāng)于perl/python語(yǔ)言的.*?,在匹配過程中,對(duì)于.*正則,一有匹配立即執(zhí)行,而不是等.*消費(fèi)了所有字符再一一回退。

PHP正則表達(dá)式模式后面通常帶有 /i, /is, /s, /isU等參數(shù),那么這都是些什么東西呢?下面我們一起來看看:

模式修正符 -- 解說正則表達(dá)式模式中使用的修正符
說明
下面列出了當(dāng)前在 PCRE 中可能使用的修正符。括號(hào)中是這些修正符的內(nèi)部 PCRE 名。修正符中的空格和換行被忽略,其它字符會(huì)導(dǎo)致錯(cuò)誤。

i (PCRE_CASELESS)
如果設(shè)定此修正符,模式中的字符將同時(shí)匹配大小寫字母。

m(PCRE_MULTILINE)
默認(rèn)情況下,PCRE 將目標(biāo)字符串作為單一的一“行”字符所組成的(甚至其中包含有換行符也是如此)?!靶衅鹗肌痹址╚)僅僅匹配字符串的起始,“行結(jié)束”元字符($)僅僅匹配字符串的結(jié)束,或者最后一個(gè)字符是換行符時(shí)其前面(除非設(shè)定了 D 修正符)。這和 Perl 是一樣的。

當(dāng)設(shè)定了此修正符,“行起始”和“行結(jié)束”除了匹配整個(gè)字符串開頭和結(jié)束外,還分別匹配其中的換行符的之后和之前。這和 Perl 的 /m 修正符是等效的。如果目標(biāo)字符串中沒有“\n”字符或者模式中沒有 ^ 或 $,則設(shè)定此修正符沒有任何效果。

s(PCRE_DOTALL)
如果設(shè)定了此修正符,模式中的圓點(diǎn)元字符(.)匹配所有的字符,包括換行符。沒有此設(shè)定的話,則不包括換行符。這和 Perl 的 /s 修正符是等效的。排除字符類例如 [^a] 總是匹配換行符的,無(wú)論是否設(shè)定了此修正符。

x(PCRE_EXTENDED)
如果設(shè)定了此修正符,模式中的空白字符除了被轉(zhuǎn)義的或在字符類中的以外完全被忽略,在未轉(zhuǎn)義的字符類之外的 # 以及下一個(gè)換行符之間的所有字符,包括兩頭,也都被忽略。這和 Perl 的 /x 修正符是等效的,使得可以在復(fù)雜的模式中加入注釋。然而注意,這僅適用于數(shù)據(jù)字符??瞻鬃址赡苡肋h(yuǎn)不會(huì)出現(xiàn)于模式中的特殊字符序列,例如引入條件子模式的序列 (?( 中間。

e
如果設(shè)定了此修正符,preg_replace() 在替換字符串中對(duì)逆向引用作正常的替換,將其作為 PHP 代碼求值,并用其結(jié)果來替換所搜索的字符串。

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

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

A(PCRE_ANCHORED)
如果設(shè)定了此修正符,模式被強(qiáng)制為“anchored”,即強(qiáng)制僅從目標(biāo)字符串的開頭開始匹配。此效果也可以通過適當(dāng)?shù)哪J奖旧韥韺?shí)現(xiàn)(在 Perl 中實(shí)現(xiàn)的方法)。

D(PCRE_DOLLAR_ENDONLY)
如果設(shè)定了此修正符,模式中的美元元字符僅匹配目標(biāo)字符串的結(jié)尾。沒有此選項(xiàng)時(shí),如果  最后一個(gè)字符是換行符的話,美元符號(hào)也會(huì)匹配此字符之前(但不會(huì)匹配任何其它換行符之前)。如果設(shè)定了 m 修正符則忽略此選項(xiàng)。Perl 中沒有與其等價(jià)的修正符。

S
當(dāng)一個(gè)模式將被使用若干次時(shí),為加速匹配起見值得先對(duì)其進(jìn)行分析。如果設(shè)定了此修正符則會(huì)進(jìn)行額外的分析。目前,分析一個(gè)模式僅對(duì)沒有單一固定起始字符的 non-anchored 模式有用。

U(PCRE_UNGREEDY)
本修正符反轉(zhuǎn)了匹配數(shù)量的值使其不是默認(rèn)的重復(fù),而變成在后面跟上“?”才變得重復(fù)。這和 Perl 不兼容。也可以通過在模式之中設(shè)定 (?U) 修正符或者在數(shù)量符之后跟一個(gè)問號(hào)(如 .*?)來啟用此選項(xiàng)。

       例如:


復(fù)制代碼 代碼如下:


    <?php 
    $str = 'src="http://www.test.cn/1.mp3" type="application/x-mplayer2"test,3333'; 
    echo preg_replace('/src="(.*)"/', '--', $str); 
    echo '<br>'; 
    echo preg_replace('/src="(.*)"/U', '--', $str); 
    echo '<br>'; 
    echo preg_replace('/src="(.*?)"/', '--', $str);//等效preg_replace('|src="(.*)"|U', '--', $str);



結(jié)果:

--test,3333

-- type="application/x-mplayer2"test,3333

-- type="application/x-mplayer2"test,3333

從這里我們就可以看出,第一個(gè)執(zhí)行結(jié)果一直匹配到最后一個(gè)滿足條件的字符,專業(yè)一點(diǎn)就叫貪婪匹配,

第二個(gè)執(zhí)行結(jié)果只匹配第一個(gè)滿足條件的字符,叫 非貪婪匹配。

X(PCRE_EXTRA)
此修正符啟用了一個(gè) PCRE 中與 Perl 不兼容的額外功能。模式中的任何反斜線后面跟上一個(gè)沒有特殊意義的字母導(dǎo)致一個(gè)錯(cuò)誤,從而保留此組合以備將來擴(kuò)充。默認(rèn)情況下,和 Perl 一樣,一個(gè)反斜線后面跟一個(gè)沒有特殊意義的字母被當(dāng)成該字母本身。當(dāng)前沒有其它特性受此修正符控制。

u(PCRE_UTF8)
此修正符啟用了一個(gè) PCRE 中與 Perl 不兼容的額外功能。模式字符串被當(dāng)成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起開始檢查模式的 UTF-8 合法性。


4. 各種操作符的運(yùn)算優(yōu)先級(jí)

相同優(yōu)先級(jí)的從左到右進(jìn)行運(yùn)算,不同優(yōu)先級(jí)的運(yùn)算先高后低。各種操作符的優(yōu)先級(jí)從高到低如下:

操作符  描述
\  轉(zhuǎn)義符
(), (?:), (?=), []  圓括號(hào)和方括號(hào)
*, +, ?, {n}, {n,}, {n,m}  限定符
^, $, \anymetacharacter  位置和順序
|  “或”操作

5. 全部符號(hào)解釋
字符  描述
\  將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè) 向后引用、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如,'n' 匹配字符 "n"。'\n' 匹配一個(gè)換行符。序列 '\\' 匹配 "\" 而 "\(" 則匹配 "("。
^  匹配輸入字符串的開始位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$  匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp 對(duì)象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。
*  匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價(jià)于{0,}。
+  匹配前面的子表達(dá)式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價(jià)于 {1,}。
?  匹配前面的子表達(dá)式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價(jià)于 {0,1}。
{n}  n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個(gè) o。
{n,}  n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價(jià)于 'o+'。'o{0,}' 則等價(jià)于 'o*'。
{n,m}  m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個(gè) o。'o{0,1}' 等價(jià)于 'o?'。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。
?  當(dāng)該字符緊跟在任何一個(gè)其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時(shí),匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對(duì)于字符串 "oooo",'o+?' 將匹配單個(gè) "o",而 'o+' 將匹配所有 'o'。
.  匹配除 "\n" 之外的任何單個(gè)字符。要匹配包括 '\n' 在內(nèi)的任何字符,請(qǐng)使用象 '[.\n]' 的模式。
(pattern)  匹配 pattern 并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 $0…$9 屬性。要匹配圓括號(hào)字符,請(qǐng)使用 '\(' 或 '\)'。
(?:pattern)  匹配 pattern 但不獲取匹配結(jié)果,也就是說這是一個(gè)非獲取匹配,不進(jìn)行存儲(chǔ)供以后使用。這在使用 "或" 字符 (|) 來組合一個(gè)模式的各個(gè)部分是很有用。例如, 'industr(?:y|ies) 就是一個(gè)比 'industry|industries' 更簡(jiǎn)略的表達(dá)式。
(?=pattern)  正向預(yù)查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。預(yù)查不消耗字符,也就是說,在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。
(?!pattern)  負(fù)向預(yù)查,在任何不匹配 pattern 的字符串開始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。預(yù)查不消耗字符,也就是說,在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始
x|y  匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。
[xyz]  字符集合。匹配所包含的任意一個(gè)字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz]  負(fù)值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z]  字符范圍。匹配指定范圍內(nèi)的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范圍內(nèi)的任意小寫字母字符。
[^a-z]  負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范圍內(nèi)的任意字符。
\b  匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B  匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx  匹配由 x 指明的控制字符。例如, \cM 匹配一個(gè) Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個(gè)原義的 'c' 字符。
\d  匹配一個(gè)數(shù)字字符。等價(jià)于 [0-9]。
\D  匹配一個(gè)非數(shù)字字符。等價(jià)于 [^0-9]。
\f  匹配一個(gè)換頁(yè)符。等價(jià)于 \x0c 和 \cL。
\n  匹配一個(gè)換行符。等價(jià)于 \x0a 和 \cJ。
\r  匹配一個(gè)回車符。等價(jià)于 \x0d 和 \cM。
\s  匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ \f\n\r\t\v]。
\S  匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。
\t  匹配一個(gè)制表符。等價(jià)于 \x09 和 \cI。
\v  匹配一個(gè)垂直制表符。等價(jià)于 \x0b 和 \cK。
\w  匹配包括下劃線的任何單詞字符。等價(jià)于'[A-Za-z0-9_]'。
\W  匹配任何非單詞字符。等價(jià)于 '[^A-Za-z0-9_]'。
\xn  匹配 n,其中 n 為十六進(jìn)制轉(zhuǎn)義值。十六進(jìn)制轉(zhuǎn)義值必須為確定的兩個(gè)數(shù)字長(zhǎng)。例如,'\x41' 匹配 "A"。'\x041' 則等價(jià)于 '\x04' & "1"。正則表達(dá)式中可以使用 ASCII 編碼。.
\num  匹配 num,其中 num 是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。例如,'(.)\1' 匹配兩個(gè)連續(xù)的相同字符。
\n  標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)向后引用。如果 \n 之前至少 n 個(gè)獲取的子表達(dá)式,則 n 為向后引用。否則,如果 n 為八進(jìn)制數(shù)字 (0-7),則 n 為一個(gè)八進(jìn)制轉(zhuǎn)義值。
\nm  標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)向后引用。如果 \nm 之前至少有 nm 個(gè)獲得子表達(dá)式,則 nm 為向后引用。如果 \nm 之前至少有 n 個(gè)獲取,則 n 為一個(gè)后跟文字 m 的向后引用。如果前面的條件都不滿足,若 n 和 m 均為八進(jìn)制數(shù)字 (0-7),則 \nm 將匹配八進(jìn)制轉(zhuǎn)義值 nm。
\nml  如果 n 為八進(jìn)制數(shù)字 (0-3),且 m 和 l 均為八進(jìn)制數(shù)字 (0-7),則匹配八進(jìn)制轉(zhuǎn)義值 nml。
\un  匹配 n,其中 n 是一個(gè)用四個(gè)十六進(jìn)制數(shù)字表示的 Unicode 字符。例如, \u00A9 匹配版權(quán)符號(hào) (?)。

6. 部分例子
正則表達(dá)式  說明

/\b([a-z]+) \1\b/gi  一個(gè)單詞連續(xù)出現(xiàn)的位置
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/  將一個(gè)URL解析為協(xié)議、域、端口及相對(duì)路徑
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/  定位章節(jié)的位置
/[-a-z]/  A至z共26個(gè)字母再加一個(gè)-號(hào)。
/ter\b/  可匹配chapter,而不能terminal
/\Bapt/  可匹配chapter,而不能aptitude
/Windows(?=95 |98 |NT )/  可匹配Windows95或Windows98或WindowsNT,當(dāng)找到一個(gè)匹配后,從Windows后面開始進(jìn)行下一次的檢索匹配。

7. 正則表達(dá)式匹配規(guī)則

7.1 基本模式匹配

一切從最基本的開始。模式,是正規(guī)表達(dá)式最基本的元素,它們是一組描述字符串特征的字符。模式可以很簡(jiǎn)單,由普通的字符串組成,也可以非常復(fù)雜,往往用特殊的字符表示一個(gè)范圍內(nèi)的字符、重復(fù)出現(xiàn),或表示上下文。例如:

    ^once

這個(gè)模式包含一個(gè)特殊的字符^,表示該模式只匹配那些以once開頭的字符串。例如該模式與字符串"once upon a time"匹配,與"There once was a man from NewYork"不匹配。正如如^符號(hào)表示開頭一樣,$符號(hào)用來匹配那些以給定模式結(jié)尾的字符串。

    bucket$

這個(gè)模式與"Who kept all of this cash in a bucket"匹配,與"buckets"不匹配。字符^和$同時(shí)使用時(shí),表示精確匹配(字符串與模式一樣)。例如:

    ^bucket$

只匹配字符串"bucket"。如果一個(gè)模式不包括^和$,那么它與任何包含該模式的字符串匹配。例如:模式

    once

與字符串

    There once was a man from NewYork
    Who kept all of his cash in a bucket.

是匹配的。

在該模式中的字母(o-n-c-e)是字面的字符,也就是說,他們表示該字母本身,數(shù)字也是一樣的。其他一些稍微復(fù)雜的字符,如標(biāo)點(diǎn)符號(hào)和白字符(空格、制表符等),要用到轉(zhuǎn)義序列。所有的轉(zhuǎn)義序列都用反斜杠(\)打頭。制表符的轉(zhuǎn)義序列是:\t。所以如果我們要檢測(cè)一個(gè)字符串是否以制表符開頭,可以用這個(gè)模式:

    ^\t

類似的,用\n表示“新行”,\r表示回車。其他的特殊符號(hào),可以用在前面加上反斜杠,如反斜杠本身用\\表示,句號(hào).用\.表示,以此類推。
7.2 字符簇
在INTERNET的程序中,正規(guī)表達(dá)式通常用來驗(yàn)證用戶的輸入。當(dāng)用戶提交一個(gè)FORM以后,要判斷輸入的電話號(hào)碼、地址、EMAIL地址、信用卡號(hào)碼等是否有效,用普通的基于字面的字符是不夠的。
所以要用一種更自由的描述我們要的模式的辦法,它就是字符簇。要建立一個(gè)表示所有元音字符的字符簇,就把所有的元音字符放在一個(gè)方括號(hào)里:

    [AaEeIiOoUu]

這個(gè)模式與任何元音字符匹配,但只能表示一個(gè)字符。用連字號(hào)可以表示一個(gè)字符的范圍,如:

    [a-z] //匹配所有的小寫字母
    [A-Z] //匹配所有的大寫字母
    [a-zA-Z] //匹配所有的字母
    [0-9] //匹配所有的數(shù)字
    [0-9\.\-] //匹配所有的數(shù)字,句號(hào)和減號(hào)
    [ \f\r\t\n] //匹配所有的白字符

同樣的,這些也只表示一個(gè)字符,這是一個(gè)非常重要的。如果要匹配一個(gè)由一個(gè)小寫字母和一位數(shù)字組成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的話,用這個(gè)模式:

    ^[a-z][0-9]$

盡管[a-z]代表26個(gè)字母的范圍,但在這里它只能與第一個(gè)字符是小寫字母的字符串匹配。

前面曾經(jīng)提到^表示字符串的開頭,但它還有另外一個(gè)含義。當(dāng)在一組方括號(hào)里使用^是,它表示“非”或“排除”的意思,常常用來剔除某個(gè)字符。還用前面的例子,我們要求第一個(gè)字符不能是數(shù)字:

    ^[^0-9][0-9]$

這個(gè)模式與"&5"、"g7"及"-2"是匹配的,但與"12"、"66"是不匹配的。下面是幾個(gè)排除特定字符的例子:

    [^a-z] //除了小寫字母以外的所有字符
    [^\\\/\^] //除了(\)(/)(^)之外的所有字符
    [^\"\'] //除了雙引號(hào)(")和單引號(hào)(')之外的所有字符

特殊字符"." (點(diǎn),句號(hào))在正規(guī)表達(dá)式中用來表示除了“新行”之外的所有字符。所以模式"^.5$"與任何兩個(gè)字符的、以數(shù)字5結(jié)尾和以其他非“新行”字符開頭的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一個(gè)“新行”的字符串。

PHP的正規(guī)表達(dá)式有一些內(nèi)置的通用字符簇,列表如下:

    字符簇 含義
    [[:alpha:]] 任何字母
    [[:digit:]] 任何數(shù)字
    [[:alnum:]] 任何字母和數(shù)字
    [[:space:]] 任何白字符
    [[:upper:]] 任何大寫字母
    [[:lower:]] 任何小寫字母
    [[:punct:]] 任何標(biāo)點(diǎn)符號(hào)
    [[:xdigit:]] 任何16進(jìn)制的數(shù)字,相當(dāng)于[0-9a-fA-F]

7.3 確定重復(fù)出現(xiàn)
到現(xiàn)在為止,你已經(jīng)知道如何去匹配一個(gè)字母或數(shù)字,但更多的情況下,可能要匹配一個(gè)單詞或一組數(shù)字。一個(gè)單詞有若干個(gè)字母組成,一組數(shù)字有若干個(gè)單數(shù)組成。跟在字符或字符簇后面的花括號(hào)({})用來確定前面的內(nèi)容的重復(fù)出現(xiàn)的次數(shù)。

    字符簇 含義
    ^[a-zA-Z_]$ 所有的字母和下劃線
    ^[[:alpha:]]{3}$ 所有的3個(gè)字母的單詞
    ^a$ 字母a
    ^a{4}$ aaaa
    ^a{2,4}$ aa,aaa或aaaa
    ^a{1,3}$ a,aa或aaa
    ^a{2,}$ 包含多于兩個(gè)a的字符串
    ^a{2,} 如:aardvark和aaab,但apple不行
    a{2,} 如:baad和aaa,但Nantucket不行
    \t{2} 兩個(gè)制表符
    .{2} 所有的兩個(gè)字符

這些例子描述了花括號(hào)的三種不同的用法。一個(gè)數(shù)字,{x}的意思是“前面的字符或字符簇只出現(xiàn)x次”;一個(gè)數(shù)字加逗號(hào),{x,}的意思是“前面的內(nèi)容出現(xiàn)x或更多的次數(shù)”;兩個(gè)用逗號(hào)分隔的數(shù)字,{x,y}表示“前面的內(nèi)容至少出現(xiàn)x次,但不超過y次”。我們可以把模式擴(kuò)展到更多的單詞或數(shù)字:

    ^[a-zA-Z0-9_]{1,}$ //所有包含一個(gè)以上的字母、數(shù)字或下劃線的字符串
    ^[0-9]{1,}$ //所有的正數(shù)
    ^\-{0,1}[0-9]{1,}$ //所有的整數(shù)
    ^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的小數(shù)

最后一個(gè)例子不太好理解,是嗎?這么看吧:與所有以一個(gè)可選的負(fù)號(hào)(\-{0,1})開頭(^)、跟著0個(gè)或更多的數(shù)字([0-9]{0,})、和一個(gè)可選的小數(shù)點(diǎn)(\.{0,1})再跟上0個(gè)或多個(gè)數(shù)字([0-9]{0,}),并且沒有其他任何東西($)。下面你將知道能夠使用的更為簡(jiǎn)單的方法。

特殊字符"?"與{0,1}是相等的,它們都代表著:“0個(gè)或1個(gè)前面的內(nèi)容”或“前面的內(nèi)容是可選的”。所以剛才的例子可以簡(jiǎn)化為:

    ^\-?[0-9]{0,}\.?[0-9]{0,}$

特殊字符"*"與{0,}是相等的,它們都代表著“0個(gè)或多個(gè)前面的內(nèi)容”。最后,字符"+"與 {1,}是相等的,表示“1個(gè)或多個(gè)前面的內(nèi)容”,所以上面的4個(gè)例子可以寫成:

    ^[a-zA-Z0-9_]+$ //所有包含一個(gè)以上的字母、數(shù)字或下劃線的字符串
    ^[0-9]+$ //所有的正數(shù)
    ^\-?[0-9]+$ //所有的整數(shù)
    ^\-?[0-9]*\.?[0-9]*$ //所有的小數(shù)

當(dāng)然這并不能從技術(shù)上降低正規(guī)表達(dá)式的復(fù)雜性,但可以使它們更容易閱讀。


8.posix和perl標(biāo)準(zhǔn)的正則表達(dá)式區(qū)別

PHP同時(shí)使用兩套正則表達(dá)式規(guī)則,一套是由電氣和電子工程師協(xié)會(huì)(IEEE)制定的POSIX Extended 1003.2兼容正則(事實(shí)上PHP對(duì)此標(biāo)準(zhǔn)的支持并不完善),另一套來自PCRE(Perl Compatible Regular Expression)庫(kù)提供PERL兼容正則,這是個(gè)開放源代碼的軟件,作者為 Philip Hazel。

使用POSIX兼容規(guī)則的函數(shù)有:
ereg_replace()
ereg()
eregi()
eregi_replace()
split()
spliti()
sql_regcase()
mb_ereg_match()
mb_ereg_replace()
mb_ereg_search_getpos()
mb_ereg_search_getregs()
mb_ereg_search_init()
mb_ereg_search_pos()
mb_ereg_search_regs()
mb_ereg_search_setpos()
mb_ereg_search()
mb_ereg()
mb_eregi_replace()
mb_eregi()
mb_regex_encoding()
mb_regex_set_options()
mb_split()

使用PERL兼容規(guī)則的函數(shù)有:
preg_grep()
preg_replace_callback()
preg_match_all()
preg_match()
preg_quote()
preg_split()
preg_replace()

定界符:

POSIX兼容正則沒有定界符,函數(shù)的相應(yīng)參數(shù)會(huì)被認(rèn)為是正則。

PERL兼容正則可以使用任何不是字母、數(shù)字或反斜線(/)的字符作為定界符,如果作為定界符的字符必須被用在表達(dá)式本身中,則需要用反斜線轉(zhuǎn)義。也可以使用(),{},[] 和 <> 作為定界符

修正符:

POSIX兼容正則沒有修正符。

PERL兼容正則中可能使用的修正符(修正符中的空格和換行被忽略,其它字符會(huì)導(dǎo)致錯(cuò)誤):

i (PCRE_CASELESS):
匹配時(shí)忽略大小寫。

m(PCRE_MULTILINE):
當(dāng)設(shè)定了此修正符,行起始(^)和行結(jié)束($)除了匹配整個(gè)字符串開頭和結(jié)束外,還分別匹配其中的換行符(/n)的之后和之前。

s(PCRE_DOTALL):
如果設(shè)定了此修正符,模式中的圓點(diǎn)元字符(.)匹配所有的字符,包括換行符。沒有此設(shè)定的話,則不包括換行符。

x(PCRE_EXTENDED):
如果設(shè)定了此修正符,模式中的空白字符除了被轉(zhuǎn)義的或在字符類中的以外完全被忽略。

e:
如果設(shè)定了此修正符,preg_replace() 在替換字符串中對(duì)逆向引用作正常的替換,將其作為 PHP 代碼求值,并用其結(jié)果來替換所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函數(shù)將忽略之。

A(PCRE_ANCHORED):
如果設(shè)定了此修正符,模式被強(qiáng)制為“anchored”,即強(qiáng)制僅從目標(biāo)字符串的開頭開始匹配。

D(PCRE_DOLLAR_ENDONLY):
如果設(shè)定了此修正符,模式中的行結(jié)束($)僅匹配目標(biāo)字符串的結(jié)尾。沒有此選項(xiàng)時(shí),如果最后一個(gè)字符是換行符的話,也會(huì)被匹配在里面。如果設(shè)定了 m 修正符則忽略此選項(xiàng)。

S:
當(dāng)一個(gè)模式將被使用若干次時(shí),為加速匹配起見值得先對(duì)其進(jìn)行分析。如果設(shè)定了此修正符則會(huì)進(jìn)行額外的分析。目前,分析一個(gè)模式僅對(duì)沒有單一固定起始字符的 non-anchored 模式有用。

U(PCRE_UNGREEDY):
使“?”的默認(rèn)匹配成為貪婪狀態(tài)的。

X(PCRE_EXTRA):
模式中的任何反斜線后面跟上一個(gè)沒有特殊意義的字母導(dǎo)致一個(gè)錯(cuò)誤,從而保留此組合以備將來擴(kuò)充。默認(rèn)情況下,一個(gè)反斜線后面跟一個(gè)沒有特殊意義的字母被當(dāng)成該字母本身。

u(PCRE_UTF8):
模式字符串被當(dāng)成UTF-8。

邏輯區(qū)隔:

POSIX兼容正則和PERL兼容正則的邏輯區(qū)隔符號(hào)作用和使用方法完全一致:
[]:包含任選一操作的相關(guān)信息。
{}:包含匹配次數(shù)的相關(guān)信息。
():包含一個(gè)邏輯區(qū)間的相關(guān)信息,可被用來進(jìn)行引用操作。
|:表示“或”,[ab]和a|b是等價(jià)的。

元字符與“[]”相關(guān):

有兩組不同的元字符:一種是模式中除了方括號(hào)內(nèi)都能被識(shí)別的,還有一種是在方括號(hào)“[]”內(nèi)被識(shí)別的。

POSIX兼容正則和PERL兼容正則“[]之外”“一致”的元字符:
/ 有數(shù)種用途的通用轉(zhuǎn)義符
^ 匹配字符串的開頭
$ 匹配字符串的結(jié)尾
? 匹配0或者1
* 匹配 0 個(gè)或多個(gè)前面指定類型的字符
+ 匹配 1 個(gè)或多個(gè)前面指定類型的字符

POSIX兼容正則和PERL兼容正則“[]之外”“不一致”的元字符:
. PERL兼容正則匹配除了換行符外的任意一個(gè)字符
. POSIX兼容正則匹配任意一個(gè)字符

POSIX兼容正則和PERL兼容正則“[]之內(nèi)”“一致”的元字符:
/ 有數(shù)種用途的通用轉(zhuǎn)義符
^ 取反字符,但僅當(dāng)其為第一個(gè)字符時(shí)有效
- 指定字符ASCII范圍,仔細(xì)研究ASCII碼,你會(huì)發(fā)現(xiàn)[W-c]等價(jià)于[WXYZ//^_`abc]

POSIX兼容正則和PERL兼容正則“[]之內(nèi)”“不一致”的元字符:
- POSIX兼容正則中[a-c-e]的指定會(huì)拋出錯(cuò)誤。
- PERL兼容正則中[a-c-e]的指定等價(jià)于[a-e]。

匹配次數(shù)與“{}”相關(guān):

POSIX兼容正則和PERL兼容正則在匹配次數(shù)方面完全一致:
{2}:表示匹配前面的字符2次
{2,}:表示匹配前面的字符2次或多次,默認(rèn)都是貪婪(盡可能多)的匹配
{2,4}:表示匹配前面的字符2次或4次

邏輯區(qū)間與“()”相關(guān):

使用()包含起來的區(qū)域是一個(gè)邏輯區(qū)間,邏輯區(qū)間的主要作用是體現(xiàn)出一些字符出現(xiàn)的邏輯次序,另一個(gè)用處就是可以用來引用(可以將此區(qū)間內(nèi)的值引用給一個(gè)變量)。后一個(gè)作用比較奇特:
<?php
$str = "http://www.163.com/";
// POSIX兼容正則:
echo ereg_replace("(.+)","<a href = //1 >//1</a>",$str);
// PERL兼容正則:
echo preg_replace("/(.+)/","<a href = $1 >$1</a>",$str);
// 顯示兩個(gè)鏈接
?>

在引用的時(shí)候,括號(hào)是可以嵌套的,邏輯次序是按照“(”出現(xiàn)的次序來標(biāo)定的。

類型匹配:

POSIX兼容正則:
[:upper:]:匹配所有的大寫字母
[:lower:]:匹配所有的小寫字母
[:alpha:]:匹配所有的字母
[:alnum:]:匹配所有的字母和數(shù)字
[:digit:]:匹配所有的數(shù)字
[:xdigit:]:匹配所有的十六進(jìn)制字符,等價(jià)于[0-9A-Fa-f]
[:punct:]:匹配所有的標(biāo)點(diǎn)符號(hào),等價(jià)于 [.,"'?!;:]
[:blank:]:匹配空格和TAB,等價(jià)于[ /t]
[:space:]:匹配所有的空白字符,等價(jià)于[ /t/n/r/f/v]
[:cntrl:]:匹配所有ASCII 0到31之間的控制符。
[:graph:]:匹配所有的可打印字符,等價(jià)于:[^ /t/n/r/f/v]
[:print:]:匹配所有的可打印字符和空格,等價(jià)于:[^/t/n/r/f/v]
[.c.]:功能不明
[=c=]:功能不明
[:<:]:匹配單詞的開始
[:>:]:匹配單詞的結(jié)尾

PERL兼容正則(這里可以看出PERL正則的強(qiáng)大):
/a alarm,即 BEL 字符('0)
/cx "control-x",其中 x 是任意字符
/e escape('0B)
/f 換頁(yè)符 formfeed('0C)
/n 換行符 newline('0A)
/r 回車符 carriage return('0D)
/t 制表符 tab('0)
/xhh 十六進(jìn)制代碼為 hh 的字符
/ddd 八進(jìn)制代碼為 ddd 的字符,或 backreference
/d 任一十進(jìn)制數(shù)字
/D 任一非十進(jìn)制數(shù)的字符
/s 任一空白字符
/S 任一非空白字符
/w 任一“字”的字符
/W 任一“非字”的字符
/b 字分界線
/B 非字分界線
/A 目標(biāo)的開頭(獨(dú)立于多行模式)
/Z 目標(biāo)的結(jié)尾或位于結(jié)尾的換行符前(獨(dú)立于多行模式)
/z 目標(biāo)的結(jié)尾(獨(dú)立于多行模式)
/G 目標(biāo)中的第一個(gè)匹配位置


上述就是小編為大家分享的如何在php中正確的使用正則表達(dá)式了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞名稱:如何在php中正確的使用正則表達(dá)式-創(chuàng)新互聯(lián)
URL標(biāo)題:http://www.rwnh.cn/article46/dgsieg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、商城網(wǎng)站面包屑導(dǎo)航、企業(yè)網(wǎng)站制作、做網(wǎng)站企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
读书| 得荣县| 新宾| 南汇区| 河曲县| 新巴尔虎左旗| 河源市| 定州市| 开平市| 霸州市| 龙陵县| 伊川县| 营山县| 铅山县| 遂川县| 桦南县| 潞西市| 铜陵市| 舟曲县| 马尔康县| 昂仁县| 高雄市| 永兴县| 扎鲁特旗| 施秉县| 麟游县| 石家庄市| 大田县| 饶阳县| 台江县| 景泰县| 南皮县| 辽阳市| 洛宁县| 沅陵县| 田东县| 九龙坡区| 连南| 杂多县| 安龙县| 龙井市|