php正則貪婪匹配與非貪婪匹配一些例子


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 
$str= "Nothing can <b>replace</b> a <b>mother</b>'s love."; 
  
// 貪婪匹配返回最大的字符串 
$IsMatch= preg_match('/<b>(.*)</b>/', $str, $match); 
if( $IsMatch ){ 
  print_r($match) . "n" ; 

/* 
輸出: 
Array 

    
[0] => <b>replace</b> a <b>mother</b> 
    
[1] => replace</b> a <b>mother 

*/
?>

沒有得到想要的內容。貪婪匹配返回最大的字符串。

非貪婪匹配


“?”當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對於字符串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。

例:

 代碼如下 復制代碼

preg_replace('/<td (.*?)>/i','<td>',$str);//匹配“<td”后出現的第一個“>”;

preg_replace('/<td (.*)>/i','<td>',$str);//匹配“<td”后出現的最后一個“>”;


preg_replace('/<td (.*?)>/i','<td>',$str);//匹配“<td”后出現的第一個“>”;也等效於preg_replace('/<td (.*)>/isU','<td>',$str);

 

另外:用$1,$2……$9可以提取()中的值。


具體方法有兩種使用修飾符U或者是?。

 代碼如下 復制代碼

<?php 
$str= "Nothing can <b>replace</b> a <b>mother</b>'s love."; 
  
// 使用?非貪婪匹配返回最小的字符串 
$IsMatch= preg_match('/<b>(.*?)</b>/', $str, $match); 
if( $IsMatch ){ 
  print_r($match) . "n" ; 

/* 
輸出: 
Array 

    
[0] => <b>replace</b> 
    
[1] => replace 

*/
  
?>

再看

 代碼如下 復制代碼


<?php 
$str= "Nothing can <b>replace</b> a <b>mother</b>'s love."; 
  
// 使用U非貪婪匹配返回最小的字符串 
$IsMatch= preg_match('/<b>(.*)</b>/U', $str, $match); 
if( $IsMatch ){ 
  print_r($match) . "n" ; 

/* 
輸出: 
Array 

    
[0] => <b>replace</b> 
    
[1] => replace 

*/
  
?>

非貪婪匹配得到了想要的結果

比如下面這個例子:

字符串:....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))
{
    echo '123';

}
 else
 {
       echo 'bbb';    
 }

運行結果,你懂的,但在gbk下上面會影響漢字判斷的准確性了,

接着gg找到一段代碼

 代碼如下 復制代碼

echo (mb_eregi("[x80-xff].","中d文") ? "有" : "無") ."漢字";
echo (mb_eregi("^([x80-xff].)+$","中文") ? "全是漢字" : "");


 代碼如下 復制代碼

<?php
$str = '漢字3測試';
if (preg_match("/([x81-xfe][x40-xfe])/", $str, $match)) {
echo '含有漢字'; 
} else {
echo '不含有漢字';
}
?>

當$str = '漢字3測試'; 時輸出"含有漢字";
當$str = 'abc345'; 時輸出"不含有漢字";

下面的例子包含gbk,gb2312的用法,需要的可以取消gbk那行的注釋,然后把utf-8的注釋掉

 代碼如下 復制代碼

<?php
$action = trim($_GET['action']);
if($action == "sub")
{
    $str = $_POST['dir'];    
    //if(!preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str)) //GB2312漢字字母數字下划線正則表達式 
    if(!preg_match("/^[x{4e00}-x{9fa5}A-Za-z0-9_]+$/u",$str))   //UTF-8漢字字母數字下划線正則表達式
    {   
        echo "<font color=red>您輸入的[".$str."]含有違法字符</font>";   
    }
    else 
    {
        echo "<font color=green>您輸入的[".$str."]完全合法,通過!</font>";   
    }
}
?>
<form method="POST" action="?action=sub">
輸入字符(數字,字母,漢字,下划線):
    <input type="text" name="dir" value="">
    <input type="submit" value="提交">
</form>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM