http://www.111cn.net/phper/210/55600.htm
貪婪模式匹配的原則是:
在可匹配也可不匹配的情況下, 優先匹配,直到不能匹配成功的情況下,記錄備選狀態,並把匹配控制交給正則表達式的下一個匹配字符,當之后的匹配失敗的時候,再回溯,進行匹配。
它會匹配盡可能多的字符。它首先看整個字符串,如果不匹配,對字符串進行收縮;遇到可能匹配的文本,停止收縮,對文本進行擴展,當發現匹配的文本時,它不着急將該匹配保存到匹配集合中,而是對文本繼續擴展,直到無法繼續匹配 或者 擴展完整個字符串,然后將前面最后一個符合匹配的文本(也是最長的)保存起來到匹配集合中。所以說它是貪婪的。
舉例說明:
preg_match 函數會返回第一個匹配的字符串。
現在有下面字符串
代碼如下 | 復制代碼 |
$str= "Nothing can <b>replace</b> a <b>mother</b>'s love." |
現在想要獲取第一個<b>replace</b>的內容。
1.貪婪匹配
代碼如下 | 復制代碼 |
<?php |
沒有得到想要的內容。貪婪匹配返回最大的字符串。
非貪婪匹配
“?”當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對於字符串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。
例:
代碼如下 | 復制代碼 |
preg_replace('/<td (.*?)>/i','<td>',$str);//匹配“<td”后出現的第一個“>”; preg_replace('/<td (.*)>/i','<td>',$str);//匹配“<td”后出現的最后一個“>”;
|
另外:用$1,$2……$9可以提取()中的值。
具體方法有兩種使用修飾符U或者是?。
代碼如下 | 復制代碼 |
<?php |
再看
代碼如下 | 復制代碼 |
|
非貪婪匹配得到了想要的結果
例
比如下面這個例子:
字符串:....src="http://www.111cn.net /1.mp3" type="application/x-mplayer2" ....
要求的結果:http://www.111cn.net /1.mp3
如果匹配表達式寫為:/src="(.*)"/,則得不到正確的結果,因為最后一個雙引號的匹配是貪婪模式的。
解決辦法:匹配表達式寫為:
代碼如下 | 復制代碼 |
/src="(.*)".?/ |
上面表達式中,".?是非貪婪模式匹配。也就是說,只要在一個字符后面跟上限定個數的特殊字符,匹配就是非貪婪模式了。
php漢字正則驗證表達式詳解
最近幾天,一直在為漢字驗證的事糾結.百度了,google了,尼瑪,找到的全是[u4e00-u9fa5]+$.這個是不對的,我怎么驗證都不行,而且.這樣驗證只能是在utf8編碼的情況下.在試了N天果后,今晚在baidu換了關鍵詞終於找到了正確的正則表達式.以 后在網上分享東西..還是要驗證過才能說啊.不能這樣坑爹啊.
好了,主角上場."/^[x{4e00}-x{9fa5}]+$/u",就是他了,拿了直接用.哈哈.給力.給個例子吧,
代碼如下 | 復制代碼 |
$str = "坑爹的漢字驗證"; if (preg_match("/^[x{4e00}-x{9fa5}]+$/u",$str)) } |
運行結果,你懂的,但在gbk下上面會影響漢字判斷的准確性了,
接着gg找到一段代碼
代碼如下 | 復制代碼 |
echo (mb_eregi("[x80-xff].","中d文") ? "有" : "無") ."漢字"; |
例
代碼如下 | 復制代碼 |
<?php |
當$str = '漢字3測試'; 時輸出"含有漢字";
當$str = 'abc345'; 時輸出"不含有漢字";
下面的例子包含gbk,gb2312的用法,需要的可以取消gbk那行的注釋,然后把utf-8的注釋掉
代碼如下 | 復制代碼 |
<?php |