foo ——————字符串“foo” ^foo ——————以“foo”開(kāi)頭的字符串 foo$ ——————以“foo”結(jié)尾的字符串 ^foo$ ——————“foo”開(kāi)頭和結(jié)尾,(只能是他自己 ) [abc]—————— a 或者b 或者c [a-z] —————— a到z之間任意字母 [^A-Z]——————除了 A-Z這些之外的字符 (gif|jpg)——————“gif”或者 “jpeg” [a-z]+—————— 一個(gè)或者多個(gè) a到z之間任意字母 [0-9.-]—————— 0-9之間任意數(shù)字,或者 點(diǎn) 或者 橫線 ^[a-zA-Z0-9_]{1,}$—————— 至少一個(gè)字母數(shù)字下劃線 ([wx])([yz])—————— wy或wz或xy或xz [^A-Za-z0-9]—————— 字符數(shù)字之外的字符 ([A-Z]{3}|[0-9]{4})—————— 三個(gè)大寫字母或者4個(gè)數(shù)字 常用的正則表達(dá)式 1、非負(fù)整數(shù):”^\d+$” 2、正整數(shù):”^[0-9]*[1-9][0-9]*$” 3、非正整數(shù):”^((-\d+)|(0+))$” 4、負(fù)整數(shù):”^-[0-9]*[1-9][0-9]*$” 5、整數(shù):”^-?\d+$” 6、非負(fù)浮點(diǎn)數(shù):”^\d+(\.\d+)?$” 7、正浮點(diǎn)數(shù):”^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$” 8、非正浮點(diǎn)數(shù):”^((-\d+\.\d+)?)|(0+(\.0+)?))$” 9、負(fù)浮點(diǎn)數(shù):”^(-((正浮點(diǎn)數(shù)正則式)))$” 10、英文字符串:”^[A-Za-z]+$” 11、英文大寫串:”^[A-Z]+$” 12、英文小寫串:”^[a-z]+$” 13、英文字符數(shù)字串:”^[A-Za-z0-9]+$” 14、英數(shù)字加下劃線串:”^\w+$” 15、E-mail地址:”^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$” 16、URL:”^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$”
preg_match() 該函數(shù)preg_match按照模式去匹配字符串,如果符合則返回TRUE,否則返回FALSE preg_match_all() 該函數(shù) preg_match_all() 在字符串中匹配出全部符合模式的字符串. * preg_match() 返回 pattern 所匹配的次數(shù)。要么是 0 次(沒(méi)有匹配)或 1 次,因?yàn)?preg_match() 在第一次匹配之后將停止搜索。 * http://www.yesky.com/imagesnew/software/php/zh/function.preg-match.html * preg_match_all() 則相反,會(huì)一直搜索到 subject 的結(jié)尾處。如果出錯(cuò) preg_match() 返回 FALSE。 * http://www.yesky.com/imagesnew/software/php/zh/function.preg-match-all.html preg_replace() 該函數(shù)與ereg_replace()類似,不同在于它利用匹配的模式去替換輸入的參數(shù) http://www.yesky.com/imagesnew/software/php/zh/function.preg-replace.htm preg_split() 該函數(shù)與split()類似 不同在于它將與正則表達(dá)式匹配的字符當(dāng)做分割的模式 http://www.yesky.com/imagesnew/software/php/zh/function.preg-split.html preg_grep() 該函數(shù)preg_grep() 匹配數(shù)組中全部元素,返回符合正則表達(dá)式的元素組成的數(shù)組 preg_quote() 轉(zhuǎn)義正則表達(dá)式字符 需要我們用程序處理的數(shù)據(jù)并不總是預(yù)先以數(shù)據(jù)庫(kù)思維設(shè)計(jì)的,或者說(shuō)是無(wú)法用數(shù)據(jù)庫(kù)的結(jié)構(gòu)去存儲(chǔ)的。
比如模版引擎解析模版、垃圾敏感信息過(guò)濾等等。 一般這種情況,我們用正則按我們的規(guī)則去匹配preg_match、替換preg_replace。 但一般的應(yīng)用中,無(wú)非是些數(shù)據(jù)庫(kù)CRUD,正則擺弄的機(jī)會(huì)很少。 根據(jù)前面說(shuō)的,兩種場(chǎng)景:統(tǒng)計(jì)分析,用匹配;處理用替換。 PHP preg_replace() 正則替換,與Javascript 正則替換不同,PHP preg_replace() 默認(rèn)就是替換所有符號(hào)匹配條件的元素。 復(fù)制代碼 代碼如下: preg_replace (正則表達(dá)式, 替換成, 字符串, 最大替換次數(shù)【默認(rèn)-1,無(wú)數(shù)次】, 替換次數(shù)) 大部分語(yǔ)言的正則表達(dá)式都是差不多的,不過(guò)也有細(xì)微的差異。 PHP 正則表達(dá)式
上表是正則表達(dá)式比較全面的解釋,而商標(biāo)中的正則字符都有特殊含義,已經(jīng)不再代表原字符含義。如正則表達(dá)式中“+”不代表加號(hào),而是代表匹配一次或多次。而如果想要讓“+”表示加號(hào),則需要在其前面加上“\”轉(zhuǎn)義,也就是用“\+”表示加號(hào)。 復(fù)制代碼 代碼如下: 1+1=2 正則表達(dá)式是: 1\+1=2 而正則表達(dá)式 1+1=2 可以代表,多個(gè)1=2,即: 11=2 正則表達(dá)式:1+1=2 111=2 正則表達(dá)式:1+1=2 1111=2 正則表達(dá)式:1+1=2 ……
也就是說(shuō)所有正則字符都有特定含義,如果需要再用來(lái)表示原字符含義,就需要在前面加“\”轉(zhuǎn)義,即使非正則字符,用“\”轉(zhuǎn)義也是沒(méi)有問(wèn)題的。 復(fù)制代碼 代碼如下: 1+1=2 正則表達(dá)式也可以是: \1\+\1\=\2 對(duì)所有字符都轉(zhuǎn)義,但是這種不建議使用。
而正則表達(dá)式必須要使用定界符包圍起來(lái),在Javascript中定界符是“/”,而在PHP中,比較常見(jiàn)的是用“/”定界,也可以用“#”定界,而且外面還需要用引號(hào)包圍起來(lái)。 如果正則表達(dá)式包含這些定界符,您就需要對(duì)這些字符進(jìn)行轉(zhuǎn)義。 PHP 正則表達(dá)式定界符 大多數(shù)語(yǔ)言的正則表達(dá)式都是由“/”作為定界符的,而在PHP中,還可以使用“#”定界,如果字符串中包含大量“/”字符,在使用“/”定界的時(shí)候,就需要對(duì)這些“/”轉(zhuǎn)義,而使用“#”就不需要轉(zhuǎn)義,更簡(jiǎn)潔。 代碼如下: <?php $weigeti='W3CSchool 在線教程的網(wǎng)址是 http://e.jb51.net/ ,你能把這個(gè)網(wǎng)址替換成正確的網(wǎng)址嗎?'; // 上面的要求就是把http://e.jb51.net/ 替換成 http://e.jb51.net/w3c/ // 其中的 . : - 都是正則符號(hào),所以需要轉(zhuǎn)義,而 / 是定界符,如果字符串中包含 / 定界符,就需要轉(zhuǎn)義 echo preg_replace('/http\:\/\/www\.jb51\.net\//','http://e.jb51.net/w3c/',$weigeti); // 在 #作為定界符,/ 就不再是定界符的含義,就不需要轉(zhuǎn)義了。 echo preg_replace('#http\://www\.jb51\.net/#','http://e.jb51.net/w3c/',$weigeti); //上面兩條輸出結(jié)果都一樣,【W(wǎng)3CSchool 在線教程的網(wǎng)址是 http://e.jb51.net/w3c/ ,你能把這個(gè)網(wǎng)址替換成正確的網(wǎng)址嗎?】 ?>
通過(guò)上面的兩條PHP 正則替換代碼我們可以發(fā)現(xiàn),如果正則語(yǔ)句中包含大量“/”,無(wú)論使用“/” 還是 “#”做定界符都是可以的,但是使用“#”能讓代碼看起來(lái)更簡(jiǎn)潔。但是E維科技建議您還是保持使用“/”作為定界符,因?yàn)樵贘avascript等語(yǔ)言中,只能使用“/”作為定界符,這樣寫起來(lái)可以形成習(xí)慣,貫通于其他語(yǔ)言中。 PHP 正則表達(dá)式修飾符 修飾符被放在PHP正則表達(dá)式定界符“/”尾部,在正則表達(dá)式尾部引號(hào)之前。 代碼如下: i 忽略大小寫,匹配不考慮大小寫 m 多行獨(dú)立匹配,如果字符串不包含[\n]等換行符就和普通正則一樣。 s 設(shè)置正則符號(hào) . 可以匹配換行符[\n],如果沒(méi)有設(shè)置,正則符號(hào).不能匹配換行符\n。 x 忽略沒(méi)有轉(zhuǎn)義的空格 e eval() 對(duì)匹配后的元素執(zhí)行函數(shù)。 A 前置錨定,約束匹配僅從目標(biāo)字符串開(kāi)始搜索 D 鎖定$作為結(jié)尾,如果沒(méi)有D,如果字符串包含[\n]等換行符,$依舊依舊匹配換行符。如果設(shè)置了修飾符m,修飾符D 就會(huì)被忽略。 S 對(duì)非錨定的匹配進(jìn)行分析 U 非貪婪,如果在正則字符量詞后加“?”,就可以恢復(fù)貪婪 X 打開(kāi)與perl 不兼容附件 u 強(qiáng)制字符串為UTF-8編碼,一般在非UTF-8編碼的文檔中才需要這個(gè)。建議UTF-8環(huán)境中不要使用這個(gè),據(jù)E維科技調(diào)查使用這個(gè)會(huì)有一個(gè)Bug。
如果您熟悉Javascript 的正則表達(dá)式,或許一定熟悉Javascript 正則表達(dá)式的修飾符“g”,代表匹配所有符合條件的元素。而在PHP 正則替換中,是匹配所有符號(hào)條件的元素,所以不存在Javascript 修飾符“g”。 PHP 正則中文和忽略大小寫PHP preg_replace() 是區(qū)分大小寫的,同時(shí)只能匹配ASCII編碼內(nèi)的字符串,如果需要匹配不區(qū)分大小寫和中文等字符需要添加相應(yīng)的修飾符 i 或 u。 代碼如下: <?php $weigeti='W3CSchool 在線教程網(wǎng)址:http://www.jb51.net/w3school/'; echo preg_replace('/W3CSchool/','w3c',$weigeti); //大小寫不同,輸出【w3c 在線教程網(wǎng)址:http://www.jb51.net/w3school/】 echo preg_replace('/W3CSchool/i','w3c',$weigeti); //忽略大小寫,執(zhí)行替換輸出【w3c 在線教程網(wǎng)址:http://e.jb51.net/w3c/】 echo preg_replace('/網(wǎng)址/u','',$weigeti); //強(qiáng)制 UTF-8中文,執(zhí)行替換,輸出【W(wǎng)3CSchool 在線教程:http://www.jb51.net/w3school/】 ?>
大小寫和中文在PHP中都是敏感的,但是在Javascript正則中,只對(duì)大小寫敏感,忽略大小寫也是通過(guò)修飾符 i 作用的,但是Javascript 不需要告知是否是UTF-8中文等特殊字符,直接可以匹配中文。 PHP 正則換行符實(shí)例 PHP 正則表達(dá)式在遇到換行符時(shí),會(huì)將換行符當(dāng)做字符串中間一個(gè)普通字符。而通用符號(hào).不能匹配\n,所以遇到帶有換行符的字符串正則會(huì)有很多要點(diǎn)。 代碼如下: <?php // 想要把上面$weigeti 替換成jb51.net echo preg_replace('/^[A-Z].*[A-Z]$/','',$weigeti); echo preg_replace('/^[A-Z].*[A-Z]$/s','',$weigeti); echo preg_replace('/^[A-Z].*[A-Z]$/m','',$weigeti); $p='/^[A-Z].*[A-Z]$/';
$preg_m === $a.$b.$c.$d;
以后您在使用PHP 抓取某個(gè)網(wǎng)站內(nèi)容,并用正則批量替換的時(shí)候,總無(wú)法避免忽略獲取的內(nèi)容包含換行符,所以在使用正則替換的時(shí)候一定要注意。 PHP 正則匹配執(zhí)行函數(shù)PHP 正則替換可以使用一個(gè)修飾符e,代表 eval() 來(lái)執(zhí)行匹配后的內(nèi)容某個(gè)函數(shù)。 代碼如下: <?php $weigeti='W3CSchool 在線教程網(wǎng)址:http://www.jb51.net ,你Jbzj!了嗎?'; // 將上面網(wǎng)址轉(zhuǎn)為小寫 echo preg_replace('/(http\:[\/\w\.\-]+\/)/e','strtolower("$1")',$weigeti); // 使用修飾符e之后,就可以對(duì)匹配的網(wǎng)址執(zhí)行PHP 函數(shù) strtolower() 了 // 輸出 【W(wǎng)3CSchool 在線教程網(wǎng)址:http://www.jb51.net ,你Jbzj!了嗎?】 ?>
根據(jù)上面代碼,盡管匹配后的函數(shù) strtolower() 在引號(hào)內(nèi),但是依舊會(huì)被eval()執(zhí)行。 正則替換匹配變量向后引用 如果您熟悉Javascript,一定對(duì)$1 $2 $3 …… 等向后引用比較熟悉,而在 PHP 中這些也可以被當(dāng)作向后引用參數(shù)。而在PHP中,還可以使用 \1 \\1 來(lái)表示向后引用。 向后引用的概念就是匹配一個(gè)大片段,這個(gè)正則表達(dá)式內(nèi)部又被用括號(hào)切割成若干小匹配元素,那么每個(gè)匹配元素就被按照小括號(hào)序列用向后引用代替。 代碼如下: <?php echo preg_replace('/.+(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+/','$1',$weigeti); echo preg_replace('/^(.+)網(wǎng)址:(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+$/','欄目:$1<br>網(wǎng)址:$2<br>商標(biāo):$3',$weigeti);
// 括號(hào)中括號(hào),外面括號(hào)先計(jì)數(shù) 驗(yàn)證域名
刪除重復(fù)的標(biāo)點(diǎn)
匹配一個(gè)XML或者HTML標(biāo)簽
檢驗(yàn)密碼的復(fù)雜度
WordPress: 使用正則獲得 帖子上的圖片
移除圖片的鏈接
PHP 常用正則表達(dá)式整理表單驗(yàn)證匹配驗(yàn)證賬號(hào),字母開(kāi)頭,允許 5-16 字節(jié),允許字母數(shù)字下劃線:^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 驗(yàn)證賬號(hào),不能為空,不能有空格,只能是英文字母:^\S+[a-z A-Z]$ 驗(yàn)證賬號(hào),不能有空格,不能非數(shù)字:^\d+$ 驗(yàn)證用戶密碼,以字母開(kāi)頭,長(zhǎng)度在 6-18 之間:^[a-zA-Z]\w{5,17}$ 驗(yàn)證是否含有 ^%&',;=?$\ 等字符:[^%&',;=?$\x22]+ 匹配Email地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 匹配騰訊QQ號(hào):[1-9][0-9]{4,} 匹配日期,只能是 2004-10-22 格式:^\d{4}\-\d{1,2}-\d{1,2}$ 匹配國(guó)內(nèi)電話號(hào)碼:^\d{3}-\d{8}|\d{4}-\d{7,8}$ 匹配中國(guó)郵政編碼:^[1-9]\d{5}(?!\d)$ 匹配身份證:\d{14}(\d{4}|(\d{3}[xX])|\d{1}) 不能為空且二十字節(jié)以上:^[\s|\S]{20,}$ 字符匹配匹配由 26 個(gè)英文字母組成的字符串:^[A-Za-z]+$ 匹配由 26 個(gè)大寫英文字母組成的字符串:^[A-Z]+$ 匹配由 26 個(gè)小寫英文字母組成的字符串:^[a-z]+$ 匹配由數(shù)字和 26 個(gè)英文字母組成的字符串:^[A-Za-z0-9]+$ 匹配由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串:^\w+$ 匹配空行:\n[\s| ]*\r 匹配任何內(nèi)容:[\s\S]* 匹配中文字符:[\x80-\xff]+ 或者 [\xa1-\xff]+ 只能輸入漢字:^[\x80-\xff],{0,}$ 匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff] 匹配數(shù)字只能輸入數(shù)字:^[0-9]*$ 只能輸入n位的數(shù)字:^\d{n}$ 只能輸入至少n位數(shù)字:^\d{n,}$ 只能輸入m-n位的數(shù)字:^\d{m,n}$ 匹配正整數(shù):^[1-9]\d*$ 匹配負(fù)整數(shù):^-[1-9]\d*$ 匹配整數(shù):^-?[1-9]\d*$ 匹配非負(fù)整數(shù)(正整數(shù) + 0):^[1-9]\d*|0$ 匹配非正整數(shù)(負(fù)整數(shù) + 0):^-[1-9]\d*|0$ 匹配正浮點(diǎn)數(shù):^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 匹配負(fù)浮點(diǎn)數(shù):^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 匹配浮點(diǎn)數(shù):^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ 匹配非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù) + 0):^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ 匹配非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù) + 0):^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ 其他匹配HTML標(biāo)記的正則表達(dá)式(無(wú)法匹配嵌套標(biāo)簽):<(\S*?)[^>]*>.*?</\1>|<.*? /> 匹配網(wǎng)址 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})+\.? 提示
|
|
來(lái)自: 學(xué)海無(wú)涯GL > 《PHP》