天天看點

php正則的簡單使用

對于開發人員來說,正規表達式是一個非常有用的功能。它提供了 查找,比對,替換 句子,單詞,或者其他格式的字元串。

【開始使用正規表達式】

對初學者來說,正則 看起來很難學習和使用。事實上他們并非你想想的那麼難,在我們深入掌握正則之前,先迅速看看這些入門基礎:

正規表達式文法

正規表達式     将會比對

foo ——————字元串“foo”  

^foo ——————以“foo”開頭的字元串  

foo$ ——————以“foo”結尾的字元串  

^foo$ ——————“foo”開頭和結尾,(隻能是他自己 )  

[abc]—————— a 或者b 或者c  

[a-z] —————— a到z之間任意字母  

[^A-Z]——————除了 A-Z這些之外的字元  

(gif|jpg)——————“gif”或者 “jpeg”  

[a-z]+—————— 一個或者多個 a到z之間任意字母  

[0-9.-]—————— 0-9之間任意數字,或者 點 或者 橫線  

^[a-zA-Z0-9_]{1,}$—————— 至少一個字母數字下劃線  

([wx])([yz])—————— wy或wz或xy或xz  

[^A-Za-z0-9]—————— 字元數字之外的字元  

([A-Z]{3}|[0-9]{4})—————— 三個大寫字母或者4個數字  

\ 将下一個字元标記為一個特殊字元、或一個原義字元、或一個 向後引用、或一個八進制轉義符。例如,'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 但不擷取比對結果,也就是說這是一個非擷取比對,不進行存儲供以後使用。這在使用 "或" 字元 (|) 來組合一個模式的各個部分是很有用。例如, 'industr(?:y|ies) 就是一個比 'industry|industries' 更簡略的表達式。  

(?=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 比對版權符号 (?)。  

【常用的正規表達式】

    1、非負整數:”^\d+$”

    2、正整數:”^[0-9]*[1-9][0-9]*$”

    3、非正整數:”^((-\d+)|(0+))$”

    4、負整數:”^-[0-9]*[1-9][0-9]*$”

    5、整數:”^-?\d+$”

    6、非負浮點數:”^\d+(\.\d+)?$”

 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+)?))$”

    9、負浮點數:”^(-((正浮點數正則式)))$”

    10、英文字元串:”^[A-Za-z]+$”

    11、英文大寫串:”^[A-Z]+$”

    12、英文小寫串:”^[a-z]+$”

    13、英文字元數字串:”^[A-Za-z0-9]+$”

    14、英數字加下劃線串:”^\w+$”

    15、E-mail位址:”^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$”

    16、URL:”^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$”

【php 正規表達式的方法】

preg_match() 該函數preg_match按照模式去比對字元串,如果符合則傳回TRUE,否則傳回FALSE  

preg_match_all() 該函數 preg_match_all() 在字元串中比對出全部符合模式的字元串.  

* preg_match() 傳回 pattern 所比對的次數。要麼是 0 次(沒有比對)或 1 次,因為 preg_match() 在第一次比對之後将停止搜尋。  

* preg_match_all() 則相反,會一直搜尋到 subject 的結尾處。如果出錯 preg_match() 傳回 FALSE。  

 preg_replace()  該函數與ereg_replace()類似,不同在于它利用比對的模式去替換輸入的參數  

 preg_split() 該函數與split()類似 不同在于它将與正規表達式比對的字元當做分割的模式  

 preg_grep() 該函數preg_grep() 比對數組中全部元素,傳回符合正規表達式的元素組成的數組  

 preg_quote() 轉義正規表達式字元  

1)驗證域名

檢驗一個字元串是否是個有效域名.

$url = "http://komunitasweb.com/";  

if (preg_match('/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i', $url)) {  

    echo "Your url is ok.";  

} else {  

    echo "Wrong url.";  

}  

從一個字元串中 突出某個單詞

這是一個非常有用的在一個字元串中比對出某個單詞 并且突出它,非常有效的搜尋結果

$text = "Sample sentence from KomunitasWeb, regex has become popular in web programming. Now we learn regex. According to wikipedia, Regular expressions (abbreviated as regex or  

regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by a regular expression processor";  

$text = preg_replace("/b(regex)b/i", '<span style="background:#5fc9f6">1</span>', $text);  

echo $text;  

突出查詢結果在你的 WordPress 部落格裡就像剛才我說的,上面的那段代碼可以很友善的搜尋出結果,而這裡是一個更好的方式去執行搜尋在某個WordPress的部落格上打開你的檔案 search.php ,然後找到 方法 the_title() 然後用下面代碼替換掉它

echo $title;  

Now, just before the modified line, add this code:  

<?php  

    $title     = get_the_title();  

    $keys= explode(" ",$s);  

    $title     = preg_replace('/('.implode('|', $keys) .')/iu',  

        '<strong>\0</strong>',  

        $title);  

?>  

Save the search.php file and open style.css. Append the following line to it:  

strong.search-excerpt { background: yellow; }  

2)從HTML文檔中獲得全部圖檔

如果你曾經希望去獲得某個網頁上的全部圖檔,這段代碼就是你需要的,你可以輕松的建立一個圖檔下載下傳機器人

$images = array();  

preg_match_all('/(img|src)=("|')[^"'>]+/i', $data, $media);  

unset($data);  

$data=preg_replace('/(img|src)("|'|="|=')(.*)/i',"$3",$media[0]);  

foreach($data as $url)  

{  

    $info = pathinfo($url);  

    if (isset($info['extension']))  

    {  

        if (($info['extension'] == 'jpg') ||  

        ($info['extension'] == 'jpeg') ||  

        ($info['extension'] == 'gif') ||  

        ($info['extension'] == 'png'))  

        array_push($images, $url);  

    }  

}  

3)删除重複字母

經常重複輸入字母? 這個表達式正适合.

$text = preg_replace("/s(w+s)1/i", "$1", $text);   

4)删除重複的标點

功能同上,但隻是面對标點,白白重複的逗号

Php代碼  收藏代碼

$text = preg_replace("/.+/i", ".", $text);  

5)比對一個XML或者HTML标簽

這個簡單的函數有兩個參數:第一個是你要比對的标簽,第二個是包含XML或HTML的變量,再強調下,這個真的很強大

function get_tag( $tag, $xml ) {  

  $tag = preg_quote($tag);  

  preg_match_all('{<'.$tag.'[^>]*>(.*?)</'.$tag.'>.'}',  

                   $xml,  

                   $matches,  

                   PREG_PATTERN_ORDER);  

  return $matches[1];  

}  

6)比對具有屬性值的XML或者HTML标簽

這個功能和上面的非常相似,但是它允許你比對的标簽内部有屬性值,例如你可以輕松比對 <div id=”header”>

function get_tag( $attr, $value, $xml, $tag=null ) {  

  if( is_null($tag) )  

    $tag = '\w+';  

  else  

    $tag = preg_quote($tag);  

  $attr = preg_quote($attr);  

  $value = preg_quote($value);  

  $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*".  

                "(['\"])$value\\2[^>]*>(.*?)<\/\\1>/"  

  preg_match_all($tag_regex,  

                 $xml,  

                 $matches,  

                 PREG_PATTERN_ORDER);  

  return $matches[3];  

}  

6)比對十六進制顔色值

web開發者的另一個有趣的工具,它允許你比對和驗證十六進制顔色值.

$string = "#555555";  

if (preg_match('/^#(?:(?:[a-fd]{3}){1,2})$/i', $string)) {  

echo "example 6 successful.";  

}  

7)查找頁面 title

這段代碼友善查找和列印 網頁 <title> 和</title> 之間的内容

Php代碼  收藏代碼

$fp = fopen("http://www.catswhocode.com/blog","r");  

while (!feof($fp) ){  

    $page .= fgets($fp, 4096);  

}  

$titre = eregi("<title>(.*)</title>",$page,$regs);  

echo $regs[1];  

fclose($fp);  

8)解釋 Apache 日志

大多數網站使用的都是著名的Apache伺服器,如果你的網站也是,那麼使用PHP正規表達式解析 apache 伺服器日志 怎麼樣?

//Logs: Apache web server  

//Successful hits to HTML files only.  Useful for counting the number of page views.  

'^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)/[^ ?"]+?.html?)??((?#parameters)[^ ?"]+)? HTTP/[0-9.]+"s+(?#status code)200s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$'  

//Logs: Apache web server  

//404 errors only  

'^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)[^ ?"]+)??((?#parameters)[^ ?"]+)? HTTP/[0-9.]+"s+(?#status code)404s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$'  

9)使用智能引号代替雙引号

如果你是一個印刷愛好者,你将喜歡這個允許用智能引号代替雙引号的正規表達式,這個正則被WORDPRESS在其内容上使用

Php代碼  收藏代碼

preg_replace('B"b([^"x84x93x94rn]+)b"B', '?1?', $text);  

10)檢驗密碼的複雜度

這個正規表達式将檢測輸入的内容是否包含6個或更多字母,數字,下劃線和連字元. 輸入必須包含至少一個大寫字母,一個小寫字母和一個數字

'A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])[-_a-zA-Z0-9]{6,}z'  

11)WordPress: 使用正則獲得 文章上的圖檔

我知道很多人是WORDPRESS的使用者,你可能會喜歡并且願意使用 那些從文章的内容檢索下來的圖像代碼。使用這個代碼在你的BLOG隻需要複制下面代碼到你的某個檔案裡

<?php if (have_posts()) : ?>  

<?php while (have_posts()) : the_post(); ?>  

<?php  

$szPostContent = $post->post_content;  

$szSearchPattern = '~<img [^>]* />~';  

// Run preg_match_all to grab all the images and save the results in $aPics  

preg_match_all( $szSearchPattern, $szPostContent, $aPics );  

// Check to see if we have at least 1 image  

$iNumberOfPics = count($aPics[0]);  

if ( $iNumberOfPics > 0 ) {  

     // Now here you would do whatever you need to do with the images  

     // For this example the images are just displayed  

     for ( $i=0; $i < $iNumberOfPics ; $i++ ) {  

          echo $aPics[0][$i];  

     };  

};  

endwhile;  

endif;  

?>  

12)自動生成笑臉圖案

被WordPress使用的另一個方法, 這段代碼可使你把圖像自動更換一個笑臉符号

Php代碼  收藏代碼

$texte='A text with a smiley  ';  

echo str_replace(':-)','<img src="smileys/souriant.png">',$texte);  

13)移除圖檔的連結

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  

<?php  

    $str = '  

        <a href="http://www.5idev.com/" target="_blank" rel="external nofollow" >5idev</a>其他字元  

        <a href="http://www.sohu.com/" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >sohu</a>  

        <a href="http://www.sohu.com/" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ><img src="http://www.fashion-press.net/img/news/3176/mot_06.jpg" /></a>  

        <br>';  

    //echo  preg_replace("/(<a.*?>)(<img.*?>)(<\/a>)/", '$2', $str);   

    echo  preg_replace("/(<a.*?>)(<img.*?>)(<\/a>)/", '\2', $str);   

?>  

【PHP 常用正規表達式整理】

表單驗證比對

驗證賬号,字母開頭,允許 5-16 位元組,允許字母數字下劃線:^[a-zA-Z][a-zA-Z0-9_]{4,15}$

驗證賬号,不能為空,不能有空格,隻能是英文字母:^\S+[a-z A-Z]$

驗證賬号,不能有空格,不能非數字:^\d+$

驗證使用者密碼,以字母開頭,長度在 6-18 之間:^[a-zA-Z]\w{5,17}$

驗證是否含有 ^%&',;=?$\ 等字元:[^%&',;=?$\x22]+

比對Email位址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

比對騰訊QQ号:[1-9][0-9]{4,}

比對日期,隻能是 2004-10-22 格式:^\d{4}\-\d{1,2}-\d{1,2}$

比對國内電話号碼:^\d{3}-\d{8}|\d{4}-\d{7,8}$

評注:比對形式如 010-12345678 或 0571-12345678 或 0831-1234567

比對中國郵政編碼:^[1-9]\d{5}(?!\d)$

比對身份證:\d{14}(\d{4}|(\d{3}[xX])|\d{1})

評注:中國的身份證為 15 位或 18 位

不能為空且二十位元組以上:^[\s|\S]{20,}$

字元比對

比對由 26 個英文字母組成的字元串:^[A-Za-z]+$

比對由 26 個大寫英文字母組成的字元串:^[A-Z]+$

比對由 26 個小寫英文字母組成的字元串:^[a-z]+$

比對由數字和 26 個英文字母組成的字元串:^[A-Za-z0-9]+$

比對由數字、26個英文字母或者下劃線組成的字元串:^\w+$

比對空行:\n[\s| ]*\r

比對任何内容:[\s\S]*

比對中文字元:[\x80-\xff]+ 或者 [\xa1-\xff]+

隻能輸入漢字:^[\x80-\xff],{0,}$

比對雙位元組字元(包括漢字在内):[^\x00-\xff]

比對數字

隻能輸入數字:^[0-9]*$

隻能輸入n位的數字:^\d{n}$

隻能輸入至少n位數字:^\d{n,}$

隻能輸入m-n位的數字:^\d{m,n}$

比對正整數:^[1-9]\d*$

比對負整數:^-[1-9]\d*$

比對整數:^-?[1-9]\d*$

比對非負整數(正整數 + 0):^[1-9]\d*|0$

比對非正整數(負整數 + 0):^-[1-9]\d*|0$

比對正浮點數:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$

比對負浮點數:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$

比對浮點數:^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

比對非負浮點數(正浮點數 + 0):^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

比對非正浮點數(負浮點數 + 0):^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

其他

比對HTML标記的正規表達式(無法比對嵌套标簽):<(\S*?)[^>]*>.*?</\1>|<.*? />

比對網址 URL :[a-zA-z]+://[^\s]*

比對 IP 位址:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)

比對完整域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?

提示

上述正規表達式通常都加了 ^ 與 $ 來限定字元的起始和結束,如果需要比對的内容包括在字元串當中,可能需要考慮去掉 ^ 和 $ 限定符。

以上正規表達式僅供參考,使用時請檢驗後再使用

【php正則修正符】

<?php   

     //标記在整個模式之外;

       例://$mode="/\bis\b/U",其中U在外面;

    //修正符:i 不區分大小寫的比對;

         //如:"/abc/i"可以與abc或aBC或ABc等比對;

    //修正符:m 将字元串視為多行,不管是那行都能比對;

       例://模式為:$mode="/abc/m";

         //要比對的字元串為:$str="bcefg5e\nabcdfe"

             //注意其中\n,換行了;abc換到了下一行;

         //$str和$mode仍可以比對,修正符m使得多行也可比對;

    //修正符:s 将字元串視為單行,換行符作為普通字元;

       例://模式為:$mode="/pr.y/";

           //要比對字元串為:$str="pr\ny";

           //兩者不可比對; . 是除了換行以外的字元可比對;

           //修改下模式為:$mode="/pr.y/s";

               //其中修正符s将\n視為普通字元,即不是換行;

           //最後兩者可以比對;

    //修正符:x 将模式中的空白忽略;

    //修正符:A 強制從目标字元串開頭比對;

         例://$mode="/abc/A";

           //可以與$str="abcsdfi"比對,

           //不可以與$str2="sdsdabc"比對;

           //因為$str2不是以abc開頭;

    //修正符:D 如果使用$限制結尾字元,則不允許結尾有換行;

         例://模式為:$mode="/abc$/";

           //可以與最後有換行的$str="adshabc\n"比對;

           //元子符$會忽略最後的換行\n;

           //如果模式為:$mode="/abc/D",

           //則不能與$str="adshabc\n"比對,

           //修正符D限制其不可有換行;必需以abc結尾;

    //修正符:U 隻比對最近的一個字元串;不重複比對;

         例:

             如模式為:

            $mode="/a.*c/";

            $str="abcabbbcabbbbbc" ;

            preg_match($mode,$str,$content);

            echo $content[0]; //輸出:abcabbbcabbbbbc;

            //如果$mode="/a.*c/";變成$mode="/a.*c/U";

             // 則隻比對最近一個字元串,輸出:abc;

//修正符:e 配合函數preg_replace()使用,

           可以把比對來的字元串當作正規表達式執行;

?>

修正符:

POSIX相容正則沒有修正符。

PERL相容正則中可能使用的修正符(修正符中的空格和換行被忽略,其它字元會導緻錯誤):

i (PCRE_CASELESS):

比對時忽略大小寫。

m (PCRE_MULTILINE):

當 設定了此修正符,行起始(^)和行結束($)除了比對整個字元串開頭和結束外,還分别比對其中的換行符(\n)的之後和之前。

s (PCRE_DOTALL):

如 果設定了此修正符,模式中的圓點元字元(.)比對所有的字元,包括換行符。沒有此設定的話,則不包括換行符。

x (PCRE_EXTENDED):

如 果設定了此修正符,模式中的空白字元除了被轉義的或在字元類中的以外完全被忽略。

e :

如果設 定了此修正符,preg_replace() 在替換字元串中對逆向引用作正常的替換,将其作為 PHP 代碼求值,并用其結果來替換所搜尋的字元串。 隻有 preg_replace() 使用此修正符,其它 PCRE 函數将忽略之。

A (PCRE_ANCHORED):

如 果設定了此修正符,模式被強制為“anchored”,即強制僅從目标字元串的開頭開始比對。

D (PCRE_DOLLAR_ENDONLY):

如 果設定了此修正符,模式中的行結束($)僅比對目标字元串的結尾。沒有此選項時,如果最後一個字元是換行符的話,也會被比對在裡面。如果設定了 m 修正符則忽略此選項。

S :

當一個模式将被使用若幹次時,為加速比對起見值得先對其進行分析。 如果設定了此修正符則會進行額外的分析。目前,分析一個模式僅對沒有單一固定起始字元的 non-anchored 模式有用。

U (PCRE_UNGREEDY):

使 “?”的預設比對成為貪婪狀态的。

X (PCRE_EXTRA):

模式中的任何反斜線後面跟上 一個沒有特殊意義的字母導緻一個錯誤,進而保留此組合以備将來擴充。預設情況下,一個反斜線後面跟一個沒有特殊意義的字母被當成該字母本身。

u (PCRE_UTF8):

模 式字元串被當成UTF-8。

注意:

     模式修正符(Pattern Modifiers)

i     -可同時比對大小寫字母

M     -将字元串視為多行

S     -将字元串視為單行,換行符做普通字元看待,使“.”比對任何字元

X     -模式中的空白忽略不計    

U     -比對到最近的字元串

e     -将替換的字元串作為表達使用

繼續閱讀