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

2021-09-07 06:53:24 字數 3079 閱讀 4888

貪婪模式匹配的原則是:

在可匹配也可不匹配的情況下, 優先匹配,直到不能匹配成功的情況下,記錄備選狀態,並把匹配控制交給正規表示式的下乙個匹配字元,當之後的匹配失敗的時候,再回溯,進行匹配。

它會匹配盡可能多的字元。它首先看整個字串,如果不匹配,對字串進行收縮;遇到可能匹配的文字,停止收縮,對文字進行擴充套件,當發現匹配的文字時,它不著急將該匹配儲存到匹配集合中,而是對文字繼續擴充套件,直到無法繼續匹配 或者 擴充套件完整個字串,然後將前面最後乙個符合匹配的文字(也是最長的)儲存起來到匹配集合中。所以說它是貪婪的。

舉例說明:

preg_match 函式會返回第乙個匹配的字串。

現在有下面字串

**如下

複製**

$str= "nothing canreplaceamother's love."

現在想要獲取第乙個replace的內容。

1.貪婪匹配

**如下

複製**

<?php 

$str= "nothing canreplaceamother's love."; 

// 貪婪匹配返回最大的字串 

$ismatch= preg_match('/(.*)/', $str, $match); 

if( $ismatch ) 

/* 輸出: 

array 

( [0] =>replaceamother

[1] => replace amother 

) */

?>

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

非貪婪匹配

「?」當該字元緊跟在任何乙個其他限制符 (*, +, ?, , , ) 後面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜尋的字串,而預設的貪婪模式則盡可能多的匹配所搜尋的字串。例如,對於字串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。

例:

**如下

複製**

preg_replace('//i','',$str);//匹配「」;

preg_replace('//i','',$str);//匹配「」;

preg_replace('//i','',$str);//匹配「」;也等效於preg_replace('//isu','',$str);

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

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

**如下

複製**

<?php 

$str= "nothing canreplaceamother's love."; 

// 使用?非貪婪匹配返回最小的字串 

$ismatch= preg_match('/(.*?)/', $str, $match); 

if( $ismatch ) 

/* 輸出: 

array 

( [0] =>replace

[1] => replace 

) */

?>

再看**如下

複製**

<?php 

$str= "nothing canreplaceamother's love."; 

// 使用u非貪婪匹配返回最小的字串 

$ismatch= preg_match('/(.*)/u', $str, $match); 

if( $ismatch ) 

/* 輸出: 

array 

( [0] =>replace

[1] => replace 

) */

?>

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

比如下面這個例子:

如果匹配表示式寫為:/src="(.*)"/,則得不到正確的結果,因為最後乙個雙引號的匹配是貪婪模式的。

解決辦法:匹配表示式寫為:

**如下

複製**

/src="(.*)".?/

上面表示式中,".?是非貪婪模式匹配。也就是說,只要在乙個字元後面跟上限定個數的特殊字元,匹配就是非貪婪模式了。

好了,主角上場."/^[x-x]+$/u",就是他了,拿了直接用.哈哈.給力.給個例子吧,

**如下

複製**

$str = "坑爹的漢字驗證";

if (preg_match("/^[x-x]+$/u",$str))

else

執行結果,***,但在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)) else

?>

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

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

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

**如下

複製**

<?php

$action = trim($_get['action']);

if($action == "sub")

-xa-za-z0-9_]+$/u",$str))   //utf-8漢字字母數字下劃線正規表示式

else 

}?>

正則非貪婪匹配

string str 註冊商 xiamen ename network technology corporation limited dba ename corp,網域名稱伺服器 whois.ename.com,相關 dns 伺服器 ns1.ename.net,dns 伺服器 ns2.ename.n...

貪婪匹配和非貪婪匹配

貪婪模式 在整個表示式匹配成功的前提下,盡可能多的匹配 非貪婪模式 在整個表示式匹配成功的前提下,盡可能少的匹配 重複匹配0次或1次 重複匹配0次或更多次 重複匹配1次或更多次 預設情況下是貪婪的!content abbbbc pattern re.compile r ab result patte...

re 正則匹配的非貪婪匹配

非貪婪匹配 將盡可能少的匹配內容,當?出現在其他的重複次數後面時會將貪婪模式改為非貪婪模式。如 abc.abc.非貪婪匹配 盡可能少的匹配?號表示 號前面的字元出現0 無數個 號表示最少匹配 號表示 號前面的字元出現1 無數個 表示0 1個 print re.findall r ab aababba...