最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

PHP正則表達式核心技術完全詳解 第11節(jié) 貪婪匹配與禁止貪婪

2020-11-14 18:32 作者:極客小俊GeekerJun  | 我要投稿

?極客小俊

?一個專注于web技術的80后

你不用拼過聰明人,你只需要拼過那些懶人 你就一定會超越大部分人!


PHP正則表達式中的貪婪匹配與 (禁止貪婪)

貪婪匹配

什么是貪婪匹配呢? 廢話不多說 先看一段代碼案例把 如下:

?$string='aaaaaaabbbbbbbbbbbbccccccc';
?//如下
?$pattern='/ab+/';
?//或者說是如下
?$pattern='/ab.+/';
?preg_match($pattern, $string,$arr);
?show($arr);

php正則表達式默認就是貪婪的 解決貪婪匹配 的辦法就是用 ? 號 所以阻止貪婪一般加? 來解決 代碼如下:

?$string='aaaaaaabbbbbbbbbbbbccccccc';
?//如下
?$pattern='/ab+?/';
?//或者說是如下
?$pattern='/ab.+?/';
?preg_match($pattern, $string,$arr);
?show($arr);

小案例1: 這里跟加不加s 視為單行字符有關系, 因為加了s 視為單行以后會產生貪婪匹配、所以阻止貪婪后 在進行全局搜索匹配! 代碼如下:

?$string='test test http://www.163.com test test <a href="http://www.baidu.com">百度</a>
? test test test <a href="http://www.sina.com">新浪</a>';
?
?//匹配網址
?$pattern='/http:\/\/(ftp|www)\.\w+.(com|org|net)/';
?//匹配href的內容 ?這里不加? 就會出現(xiàn)貪婪匹配
?$pattern='/href="(.+?)"/s';
?
?preg_match_all($pattern, $string,$arr);
?show($arr);

?

小案例2: 刪除某一個class文件中的所有注釋 ?例如:Car.class.php文件 內容如下:

? <?php
?
?/**
? * @description
? * @author 3#
? */
?interface Car{
? ? ?function run();
?}
?
?
?/**
? *
? * @description 寶馬車類
? *
? */
?class Bmw implements Car{
? ? ?public function run(){
? ? ? ? ?echo '寶馬車子在跑!!';
? ? ?}
?}
?
?
?/**
? * @description 奔馳車類
? *
? */
?class Bz implements Car{
? ? ?public function run(){
? ? ? ? ?echo '奔馳車子在跑!!';
? ? ?}
?}
?
?
?// $Bmw=new Bmw();
?// $Bmw->run();
?// echo '<br>';
?// $Bz=new Bz();
?// $Bz->run();
?
??>

然后處理這個Car.class.php中的注釋,把里面的注釋都刪掉 通常我們是如下處理的

?//載入文件
?$file='./Car.class.php';
?$content=file_get_contents($file);
?//正則匹配
?$pattern='/\/\*\*.*\*\//s';
?//替換為空
?$result=preg_replace($pattern, '', $content);
?//最后把處理好的字符重新寫入帶文件中
?file_put_contents($file, $result);

以上這樣處理看似沒什么問題,但是當你打開Car.class.php這個文件的時候你要大吃一驚的!! ?現(xiàn)在Car.class.php里面應該只剩下 下面這個類了 其他的都不見了!!

?class Bz implements Car{
? ? ?public function run(){
? ? ? ? ?echo '奔馳車子在跑!!';
? ? ?}
?}

原因:如果這樣替換會產生如下情況: ?原因是;貪婪匹配 .* 匹配了/* 開始一直到 /結尾、 中間無論什么內容都被視為 . 的范疇之內了!


禁止貪婪

正確的做法是加上? 號 阻止貪婪匹配 ? 代碼如下:

?//載入文件
?$file='./Car.class.php';
?$content=file_get_contents($file);
?//正則匹配 并且禁止貪婪
?$pattern='/\/\*\*.*?\*\//s';
?//替換為空
?$result=preg_replace($pattern, '', $content);
?//最后把處理好的字符重新寫入帶文件中
?file_put_contents($file, $result);

結果Car.class.php文件中的注釋就全部刪除了 ,Car.class.php文件中的代碼如下:

?interface Car{
? ? ?function run();
?}
?
?
?
?class Bmw implements Car{
? ? ?public function run(){
? ? ? ? ?echo '寶馬車子在跑!!';
? ? ?}
?}
?
?
?
?class Bz implements Car{
? ? ?public function run(){
? ? ? ? ?echo '奔馳車子在跑!!';
? ? ?}
?}

小案例3: 查找a出現(xiàn)1次到5次, 也包含之間的, 這種默認也是貪婪的,因為它會取出最大匹配的那一次! 也就是5次 如下代碼:

$string='cbaaaaaa';?

$pattern='/ba{1,5}/is';?

preg_match($pattern, $string,$arr);?

show($arr);

加上 ? 號 以后 就可以阻止貪婪匹配 并且取出最小匹配次數(shù) 如下代碼:

$string='cbaaaaaa';?

$pattern='/ba{1,5}?/is';?

preg_match($pattern, $string,$arr);?

show($arr);

小提示: ??兩個 問號就是完全取最小的 一個? 號表示取 0或者 1 兩個?號就表示禁止貪婪 取完全最小值0, 例如:案例中一個?號表示還是取了1個a ,但是兩個??問號就一定沒有a了 ?因為兩個?? 號表示0、等同于這樣寫: /ba{0}/ 代碼如下:

$string='cbaaaaaa';?

$pattern='/ba??/is';?

preg_match($pattern, $string,$arr);?

show($arr);

在這里插入圖片描述


如果喜歡話請 點贊 ?評論 ?收藏 一鍵三連 ?

大家的支持就是我堅持下去的動力!


PHP正則表達式核心技術完全詳解 第11節(jié) 貪婪匹配與禁止貪婪的評論 (共 條)

分享到微博請遵守國家法律
佛冈县| 万年县| 阿克苏市| 双鸭山市| 罗江县| 昂仁县| 尼木县| 道孚县| 临夏市| 奇台县| 霸州市| 南丹县| 泰和县| 连平县| 务川| 昭平县| 元氏县| 平利县| 乡城县| 靖西县| 龙海市| 武夷山市| 卢氏县| 台安县| 米泉市| 偏关县| 丹巴县| 永平县| 天长市| 江西省| 汉川市| 吉木萨尔县| 富民县| 苍南县| 邢台市| 钟祥市| 武汉市| 剑河县| 和平区| 巢湖市| 尉犁县|