php正則表達(dá)式

            PHP正則表達(dá)式,作為一種快速、便捷的處理字符串的工具,在各種編程語言中都有著廣泛的用途,通過在PHP中的一些使用,下面記錄一下關(guān)于PHP正則表達(dá)式的一些相關(guān)技巧。

          PHP正則表達(dá)式主要用于字符串的模式分割、匹配、查找及替換操作。使用正則表達(dá)式在某些簡(jiǎn)單的環(huán)境下可能效率不高,因此如何更好的使用PHP正則表達(dá)式需要綜合考慮

          我的PHP正則入門,是起源于網(wǎng)上的一篇文章[1],這篇文章由淺入深的闡述了PHP正則表達(dá)式使用的方法,我覺得是一個(gè)很好的入門材料,不過學(xué)成 還是要靠個(gè)人,在使用的過程中,還是會(huì)不斷地忘記,因此反反復(fù)復(fù)的閱讀了這篇文章有四五遍,對(duì)于其中一些比較困難的知識(shí)點(diǎn),甚至要用很久才能消化,但是只 要能見堅(jiān)持著看完,你會(huì)發(fā)現(xiàn)自己對(duì)于正則的運(yùn)用能力就會(huì)顯著提高。51CTO編輯推薦《PHP開發(fā)基礎(chǔ)入門

          PHP正則表達(dá)式的定義:

          用于描述字符排列和匹配模式的一種語法規(guī)則。它主要用于字符串的模式分割、匹配、查找及替換操作。

          PHP中的正則函數(shù):

          PHP中有兩套正則函數(shù),兩者功能差不多,分別為:

          一套是由PCRE(Perl Compatible Regular Expression)庫(kù)提供的。使用“preg_”為前綴命名的函數(shù);

          一套由POSIX(Portable Operating System Interface of Unix )擴(kuò)展提供的。使用以“ereg_”為前綴命名的函數(shù);(POSIX的正則函數(shù)庫(kù),自PHP 5.3以后,就不在推薦使用,從PHP6以后,就將被移除)

          由于POSIX正則即將推出歷史舞臺(tái),并且PCRE和perl的形式差不多,更利于我們?cè)趐erl和php之間切換,所以這里重點(diǎn)介紹PCRE正則的使用。

          PCRE正則表達(dá)式

          PCRE全稱為Perl Compatible Regular Expression,意思是Perl兼容正則表達(dá)式。

          在PCRE中,通常將模式表達(dá)式(即正則表達(dá)式)包含在兩個(gè)反斜線“/”之間,如“/apple/”。

          正則中重要的幾個(gè)概念有:元字符、轉(zhuǎn)義、模式單元(重復(fù))、反義、引用和斷言,這些概念都可以在文章[1]中輕松的理解和掌握。

          常用的元字符(Meta-character):

          元字符     說明

          \A       匹配字符串串首的原子

          \Z       匹配字符串串尾的原子

          \b       匹配單詞的邊界     /\bis/   匹配頭為is的字符串   /is\b/   匹配尾為is的字符串   /\bis\b/ 定界

          \B       匹配除單詞邊界之外的任意字符   /\Bis/   匹配單詞“This”中的“is”

          \d     匹配一個(gè)數(shù)字;等價(jià)于[0-9]

          \D     匹配除數(shù)字以外任何一個(gè)字符;等價(jià)于[^0-9]

          \w     匹配一個(gè)英文字母、數(shù)字或下劃線;等價(jià)于[0-9a-zA-Z_]

          \W     匹配除英文字母、數(shù)字和下劃線以外任何一個(gè)字符;等價(jià)于[^0-9a-zA-Z_]

          \s     匹配一個(gè)空白字符;等價(jià)于[\f\t\v]

          \S     匹配除空白字符以外任何一個(gè)字符;等價(jià)于[^\f\t\v]

          \f     匹配一個(gè)換頁(yè)符等價(jià)于 \x0c 或 \cL

          \n     匹配一個(gè)換行符;等價(jià)于 \x0a 或 \cJ

          \r     匹配一個(gè)回車符等價(jià)于\x0d 或 \cM

          \t     匹配一個(gè)制表符;等價(jià)于 \x09\或\cl

          \v     匹配一個(gè)垂直制表符;等價(jià)于\x0b或\ck

          \oNN   匹配一個(gè)八進(jìn)制數(shù)字

          \xNN   匹配一個(gè)十六進(jìn)制數(shù)字

          \cC    匹配一個(gè)控制字符

          模式修正符(Pattern Modifiers):

          模式修正符在忽略大小寫、匹配多行中使用特別多,掌握了這一個(gè)修正符,往往能解決我們遇到的很多問題。

          i     -可同時(shí)匹配大小寫字母

          M     -將字符串視為多行

          S     -將字符串視為單行,換行符做普通字符看待,使“.”匹配任何字符

          X     -模式中的空白忽略不計(jì)   

          U     -匹配到最近的字符串

          e     -將替換的字符串作為表達(dá)使用

          格式:/apple/i匹配“apple”或“Apple”等,忽略大小寫。     /i

          PCRE的模式單元:

          //1 提取第一位的屬性

          /^\d{2} ([\W])\d{2}\\1\d{4}$匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字符串。但上述正則表達(dá)式不匹配“12/34-5678”的格式。這是因?yàn)槟J?#8220;[\W]”的結(jié)果“/”已經(jīng)被存儲(chǔ)。下個(gè)位置“\1”引用 時(shí),其匹配模式也是字符“/”。

          當(dāng)不需要存儲(chǔ)匹配結(jié)果時(shí)使用非存儲(chǔ)模式單元“(?:)”

          例如/(?:a|b|c)(D|E|F)\\1g/ 將匹配“aEEg”。在一些正則表達(dá)式中,使用非存儲(chǔ)模式單元是必要的。否則,需要改變其后引用的順序。上例還可以寫成/(a|b|c)(C|E|F)\2g/。

          PCRE正則表達(dá)式函數(shù):

          1. preg_match()和preg_match_all()  
          2. preg_quote()  
          3. preg_split()  
          4. preg_grep()  
          5. preg_replace() 

          函數(shù)的具體使用,我們可以通過PHP手冊(cè)來找到,下面分享一些平時(shí)積累的正則表達(dá)式:

          匹配action屬性 

          1. $str = '';  
          2.     $match = '';  
          3.     preg_match_all('/\s+action=\"(?!http:)(.*?)\"\s/'$str$match);  
          4.     print_r($match); 

          在正則中使用回調(diào)函數(shù)

          1. /**  
          2.    * replace some string by callback function  
          3.    *  
          4.    */ 
          5.   function callback_replace() {  
          6.       $url = 'http://esfang.house.sina.com.cn';  
          7.       $str = '';  
          8.       $str = preg_replace ( '/(?<=\saction=\")(?!http:)(.*?)(?=\"\s)/e''search(\$url, \\1)'$str );  
          9.         
          10.       echo $str;  
          11.   }  
          12.     
          13.   function search($url$match){  
          14.       return $url . '/' . $match;  
          15.   } 

          帶斷言的正則匹配

          1. $match = '';  
          2.    $str = 'xxxxxx.com.cn bold font 

            paragraph text

            '
            ;  
          3.    preg_match_all ( '/(?<=<(\w{1})>).*(?=<\/\1>)/'$str$match );  
          4.    echo "匹配沒有屬性的HTML標(biāo)簽中的內(nèi)容:";  
          5.    print_r ( $match ); 

          替換HTML源碼中的地址   

          1. $form_html = preg_replace ( '/(?<=\saction=\"|\ssrc=\"|\shref=\")(?!http:|javascript)(.*?)(?=\"\s)/e''add_url(\$url, \'\\1\')'$form_html ); 

          最后,正則工具雖然強(qiáng)大,但是從效率和編寫時(shí)間上來講,有的時(shí)候可能沒有explode來的更直接,對(duì)于一些緊急或者要求不高的任務(wù),簡(jiǎn)單、粗暴的方法也許更好。

          而對(duì)于preg和ereg兩個(gè)系列之間的執(zhí)行效率,曾看到文章說preg要更快一點(diǎn),具體由于使用ereg的時(shí)候并不多,而且也要推出歷史舞臺(tái)了,再加個(gè)個(gè)人更偏好于PCRE的方式,所以筆者就不做比較了,熟悉的朋友可以發(fā)表下意見,謝謝。

          posted on 2010-12-03 13:25 丁克設(shè)計(jì) 閱讀(475) 評(píng)論(3)  編輯  收藏 所屬分類: PHP技術(shù)文檔

          評(píng)論

          # re: php正則表達(dá)式 2013-04-01 20:44 ee

          regfeew  回復(fù)  更多評(píng)論   

          # re: php正則表達(dá)式 2013-04-01 20:44 ee

          泥煤  回復(fù)  更多評(píng)論   

          # re: php正則表達(dá)式 2013-04-01 20:45 ee

          請(qǐng)不要發(fā)表任何與政治相關(guān)的內(nèi)容  回復(fù)  更多評(píng)論   

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          留言簿(6)

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          主站蜘蛛池模板: 福鼎市| 玉环县| 营山县| 湘潭县| 吴川市| 云浮市| 聂拉木县| 隆化县| 宁城县| 同心县| 仁寿县| 淄博市| 肇东市| 襄汾县| 都江堰市| 龙州县| 吉林市| 清水县| 镇平县| 阿坝| 宁南县| 武邑县| 紫金县| 马鞍山市| 资兴市| 阿勒泰市| 沭阳县| 龙州县| 利川市| 中宁县| 武山县| 留坝县| 靖远县| 晋城| 宜都市| 潜江市| 靖宇县| 沙河市| 吴旗县| 茌平县| 瓦房店市|