美麗的fnmatch 匹配函式

2021-06-27 06:38:04 字數 1929 閱讀 5314

最近在寫專案時,需要用到萬用字元匹配一些字串,需要類似*匹配所有字元,?匹配單個字元的做法,在php中找到了fnmatch函式可使用,但發現它不能使用在windows的環境中,後來在網上搜尋到一篇文章

該貼中有兩種方法可以實現fnmatch函式,現貼如下:

function fnmatch($pattern, $string)         //$pattern匹配式, $string被匹配的字串

; //取得當前在比較的字元

$pc = ($ptnstart < 0) ? '' : $pattern;//取得匹配式當前的字元,已到結束位置,給個空

if($sc !== $pc)

) === '*')

$ptnstart --; //while這段是去除幾個連續的*號, 並嘗試和取得下乙個字元

if($ptnstart > 0 && ($pc === $sc || $pc === '?'))//比較下個字元是否相同或是?號

}elseif($pc === '?') //如果匹配式當前字元是?號, 進行?號匹配

elseif($countstack > 0) //如果不是萬用字元,檢查棧中是否有儲存上乙個*號的位置

else

}else

} //匹配迴圈結束

if($ptnstart === -1) //剛好匹配式的位置也結束, 則匹配成功, 返回true

elseif($ptnstart >= 0) //匹配式並沒有結束, 還有一些沒有匹配

=== '*')//檢查剩下的是不是都是*號,去除這些*號

$ptnstart --;

if($pattern === '*') //最後的只有乙個*號結束的話, 就匹配成功, 返回true

return true;

else

return false; //否則, 返回false

}return false;

}

if (!function_exists('fnmatch')) =!<>|'), array('*' => '.*', '?' => '.?')) . '$/i', $string);

}}

這兩個方法都可以實現,但由於我要匹配的有包含中文的,比如

我愛中國

匹配 我愛??

就無法實現了,因為「中國」這個字元算4個字元,假如 匹配 我愛???? 應該就沒問題了,但是這樣對於我們來說使用非常的不方便,於是我改了乙個第乙個函式的實現,使用mb_strlen的方法來統計和分割字元,實現如下:

function fnmatch($pattern, $string)         //$pattern匹配式, $string被匹配的字串

}elseif($pc === '?') //如果匹配式當前字元是?號, 進行?號匹配

elseif($countstack > 0) //如果不是萬用字元,檢查棧中是否有儲存上乙個*號的位置

else

}else

} //匹配迴圈結束

if($ptnstart === -1) //剛好匹配式的位置也結束, 則匹配成功, 返回true

elseif($ptnstart >= 0) //匹配式並沒有結束, 還有一些沒有匹配

return false;

}

實現完畢,可完美匹配中文了。

fnmatch 檔名的正則匹配

fnmatch int fnmatch const char pattern,const char string,int flags man中是這麼寫道 the fnmatch function checks whether the string argument matches the patte...

fnmatch模組的使用

此模組的主要作用是檔名稱的匹配,並且匹配的模式使用的unix shell風格。fnmatch比較簡單就4個方法分別是 fnmatch,fnmatchcase,filter,translate 測試filename,是否符合pattern。import fnmatch import os defrun...

fnmatch模組的使用

fnmatch 函式根據指定的模式來匹配檔名或字串。此模組的主要作用是檔名稱的匹配,並且匹配的模式使用的unix shell風格。字面意思感覺就是filename match。如下 import os import fnmatch for filename in os.listdir test if...