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個數字
1 \ 將下一個字符標記爲一個特殊字符、或一個原義字符、或一個 向後引用、或一個八進制轉義符。例如,'n' 匹配字符 "n"。'\n' 匹配一個換行符。序列 '\\' 匹配 "\" 而 "\(" 則匹配 "("。 2 ^ 匹配輸入字符串的開始位置。若是設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 以後的位置。 3 $ 匹配輸入字符串的結束位置。若是設置了RegExp 對象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 以前的位置。 4 * 匹配前面的子表達式零次或屢次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。 5 + 匹配前面的子表達式一次或屢次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。 6 ? 匹配前面的子表達式零次或一次。例如,"do(es)?" 能夠匹配 "do" 或 "does" 中的"do" 。? 等價於 {0,1}。 7 {n} n 是一個非負整數。匹配肯定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',可是能匹配 "food" 中的兩個 o。 8 {n,} n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的全部 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。 9 {n,m} m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。 10 ? 當該字符緊跟在任何一個其餘限制符 (*, +, ?, {n}, {n,}, {n,m}) 後面時,匹配模式是非貪婪的。非貪婪模式儘量少的匹配所搜索的字符串,而默認的貪婪模式則儘量多的匹配所搜索的字符串。例如,對於字符串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配全部 'o'。 11 . 匹配除 "\n" 以外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用象 '[.\n]' 的模式。 12 (pattern) 匹配 pattern 並獲取這一匹配。所獲取的匹配能夠從產生的 Matches 集合獲得,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 $0…$9 屬性。要匹配圓括號字符,請使用 '\(' 或 '\)'。 13 (?:pattern) 匹配 pattern 但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供之後使用。這在使用 "或" 字符 (|) 來組合一個模式的各個部分是頗有用。例如, 'industr(?:y|ies) 就是一個比 'industry|industries' 更簡略的表達式。 14 (?=pattern) 正向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不須要獲取供之後使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配以後當即開始下一次匹配的搜索,而不是從包含預查的字符以後開始。 15 (?!pattern) 負向預查,在任何不匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不須要獲取供之後使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配以後當即開始下一次匹配的搜索,而不是從包含預查的字符以後開始 16 x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。 17 [xyz] 字符集合。匹配所包含的任意一個字符。例如, '[abc]' 能夠匹配 "plain" 中的 'a'。 18 [^xyz] 負值字符集合。匹配未包含的任意字符。例如, '[^abc]' 能夠匹配 "plain" 中的'p'。 19 [a-z] 字符範圍。匹配指定範圍內的任意字符。例如,'[a-z]' 能夠匹配 'a' 到 'z' 範圍內的任意小寫字母字符。 20 [^a-z] 負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,'[^a-z]' 能夠匹配任何不在 'a' 到 'z' 範圍內的任意字符。 21 \b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 能夠匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 22 \B 匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 23 \cx 匹配由 x 指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須爲 A-Z 或 a-z 之一。不然,將 c 視爲一個原義的 'c' 字符。 24 \d 匹配一個數字字符。等價於 [0-9]。 25 \D 匹配一個非數字字符。等價於 [^0-9]。 26 \f 匹配一個換頁符。等價於 \x0c 和 \cL。 27 \n 匹配一個換行符。等價於 \x0a 和 \cJ。 28 \r 匹配一個回車符。等價於 \x0d 和 \cM。 29 \s 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。 30 \S 匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。 31 \t 匹配一個製表符。等價於 \x09 和 \cI。 32 \v 匹配一個垂直製表符。等價於 \x0b 和 \cK。 33 \w 匹配包括下劃線的任何單詞字符。等價於'[A-Za-z0-9_]'。 34 \W 匹配任何非單詞字符。等價於 '[^A-Za-z0-9_]'。 35 \xn 匹配 n,其中 n 爲十六進制轉義值。十六進制轉義值必須爲肯定的兩個數字長。例如,'\x41' 匹配 "A"。'\x041' 則等價於 '\x04' & "1"。正則表達式中可使用 ASCII 編碼。. 36 \num 匹配 num,其中 num 是一個正整數。對所獲取的匹配的引用。例如,'(.)\1' 匹配兩個連續的相同字符。 37 \n 標識一個八進制轉義值或一個向後引用。若是 \n 以前至少 n 個獲取的子表達式,則 n 爲向後引用。不然,若是 n 爲八進制數字 (0-7),則 n 爲一個八進制轉義值。 38 \nm 標識一個八進制轉義值或一個向後引用。若是 \nm 以前至少有 nm 個得到子表達式,則 nm 爲向後引用。若是 \nm 以前至少有 n 個獲取,則 n 爲一個後跟文字 m 的向後引用。若是前面的條件都不知足,若 n 和 m 均爲八進制數字 (0-7),則 \nm 將匹配八進制轉義值 nm。 39 \nml 若是 n 爲八進制數字 (0-3),且 m 和 l 均爲八進制數字 (0-7),則匹配八進制轉義值 nml。 40 \un 匹配 n,其中 n 是一個用四個十六進制數字表示的 Unicode 字符。例如, \u00A9 匹配版權符號 (?)。
經常使用的正則表達式 一、非負整數:」^\d+$」 二、正整數:」^[0-9]*[1-9][0-9]*$」 三、非正整數:」^((-\d+)|(0+))$」 四、負整數:」^-[0-9]*[1-9][0-9]*$」 五、整數:」^-?\d+$」 六、非負浮點數:」^\d+(\.\d+)?$」 七、正浮點數:」^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$」 八、非正浮點數:」^((-\d+\.\d+)?)|(0+(\.0+)?))$」 九、負浮點數:」^(-((正浮點數正則式)))$」 十、英文字符串:」^[A-Za-z]+$」 十一、英文大寫串:」^[A-Z]+$」 十二、英文小寫串:」^[a-z]+$」 1三、英文字符數字串:」^[A-Za-z0-9]+$」 1四、英數字加下劃線串:」^\w+$」 1五、E-mail地址:」^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$」 1六、URL:」^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$」
preg_match() 該函數preg_match按照模式去匹配字符串,若是符合則返回TRUE,不然返回FALSE preg_match_all() 該函數 preg_match_all() 在字符串中匹配出所有符合模式的字符串. * preg_match() 返回 pattern 所匹配的次數。要麼是 0 次(沒有匹配)或 1 次,由於 preg_match() 在第一次匹配以後將中止搜索。 * http://www.yesky.com/imagesnew/software/php/zh/function.preg-match.html * preg_match_all() 則相反,會一直搜索到 subject 的結尾處。若是出錯 preg_match() 返回 FALSE。 * http://www.yesky.com/imagesnew/software/php/zh/function.preg-match-all.html preg_replace() 該函數與ereg_replace()相似,不一樣在於它利用匹配的模式去替換輸入的參數 http://www.yesky.com/imagesnew/software/php/zh/function.preg-replace.htm preg_split() 該函數與split()相似 不一樣在於它將與正則表達式匹配的字符當作分割的模式 http://www.yesky.com/imagesnew/software/php/zh/function.preg-split.html preg_grep() 該函數preg_grep() 匹配數組中所有元素,返回符合正則表達式的元素組成的數組 preg_quote() 轉義正則表達式字符
驗證域名
檢驗一個字符串是不是個有效域名.php
$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."; }
從一個字符串中 突出某個單詞
這是一個很是有用的在一個字符串中匹配出某個單詞 而且突出它,很是有效的搜索結果css
$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() 而後用下面代碼替換掉它html
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; }
從HTML文檔中得到所有圖片
若是你曾經但願去得到某個網頁上的所有圖片,這段代碼就是你須要的,你能夠輕鬆的創建一個圖片下載機器人web
$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); } }
刪除重複字母
常常重複輸入字母? 這個表達式正適合.正則表達式
$text = preg_replace("/s(w+s)1/i", "$1", $text);
刪除重複的標點
功能同上,但只是面對標點,白白重複的逗號express
$text = preg_replace("/.+/i", ".", $text);
匹配一個XML或者HTML標籤
這個簡單的函數有兩個參數:第一個是你要匹配的標籤,第二個是包含XML或HTML的變量,再強調下,這個真的很強大apache
function get_tag( $tag, $xml ) { $tag = preg_quote($tag); preg_match_all('{<'.$tag.'[^>]*>(.*?)</'.$tag.'>.'}', $xml, $matches, PREG_PATTERN_ORDER); return $matches[1]; }
匹配具備屬性值的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]; }
匹配十六進制顏色值
web開發者的另外一個有趣的工具,它容許你匹配和驗證十六進制顏色值.服務器
$string = "#555555"; if (preg_match('/^#(?:(?:[a-fd]{3}){1,2})$/i', $string)) { echo "example 6 successful."; }
查找頁面 title
這段代碼方便查找和打印 網頁 <title> 和</title> 之間的內容dom
$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);
解釋 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)[^"]*)"$'
使用智能引號代替雙引號
若是你是一個印刷愛好者,你將喜歡這個容許用智能引號代替雙引號的正則表達式,這個正則被WORDPRESS在其內容上使用
preg_replace('B"b([^"x84x93x94rn]+)b"B', '?1?', $text);
檢驗密碼的複雜度
這個正則表達式將檢測輸入的內容是否包含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'
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; ?>
自動生成笑臉圖案
被WordPress使用的另外一個方法, 這段代碼可以使你把圖像自動更換一個笑臉符號
$texte='A text with a smiley '; echo str_replace(':-)','<img src="smileys/souriant.png">',$texte);
移除圖片的連接
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <?php $str = ' <a href="http://www.5idev.com/">5idev</a>其餘字符 <a href="http://www.sohu.com/">sohu</a> <a href="http://www.sohu.com/"><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); ?>
驗證帳號,字母開頭,容許 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})+\.?
原文:http://justcoding.iteye.com/blog/730513