正則表達式之難點

  • 斷言
  1. ?<= 這個是對需要匹配的目標左邊的(前面)的進行斷言取试,斷定它前面會出現(xiàn)的 但是不會被匹配到胸梆。如:
$subject = 'I am Lancer, Please say hello Lancer';

//目標: 我要把hello 后面的Lancer  改為  '!' .
$pattern = '/(?<=hello )Lancer/';
$result = preg_replace($pattern, '', $subject);
echo $result;  //I am Lancer, Please say hello !
這樣就成功咯~
  1. ?=,與上面的位置剛好相反硼控,這個是對需要匹配的目標右邊的(后面)的進行斷言蚁飒,斷定它后面會出現(xiàn)的 但是不會被匹配到痊项。如:
$subject = 'I love you! I love her too!';

//目標:不能愛這么多锅风, 把第二個 'love' 改為 'hate'
$pattern = '/love(?= her)/';
$result = preg_replace($pattern, 'hate', $subject);
echo $result;  //'I love you! I hate her too!'
  1. ?<!這個是需要對匹配左邊的(前面的)進行斷言,不過它是非鞍泉,找到不是這個的皱埠。還是拿第一個例子來說:
$subject = 'I am Lancer, Please say hello Lancer';

//目標: 我還是要把hello 后面的Lancer  改為  '!'  該怎么做
$pattern = '/(?<!am )Lancer/';  //找到‘Lancer’前面不是'am '的'Lancer'
$result = preg_replace($pattern, '', $subject);
echo $result;  //I am Lancer, Please say hello !
  1. ?!還是一樣的秘方,還是一樣的味道~
$subject = 'I love you! I love her too!';

//目標:不能愛這么多咖驮, 把第二個 'love' 改為 'hate'
$pattern = '/love(?! you)/';
$result = preg_replace($pattern, 'hate', $subject);
echo $result;  //'I love you! I hate her too!'

總結(jié):這個斷言边器,作用主要在训枢,對于很多同樣的目標,可是我只要其中的一個忘巧,或者多個的時候恒界,那么就可以根據(jù)它的前面和后面,進行斷言砚嘴,來區(qū)分他們找到自己想要匹配的目標十酣。

  • 捕獲
    先來說一下, 什么叫捕獲际长。就是匹配之后耸采,會根據(jù)你正則表達式中的()來進行分組。一一捕獲工育。打個比方:
//為了顯示方便虾宇,寫了個show函數(shù)
function show($str)
{
    if (empty($str)) {
        echo null;
    } elseif (is_array($str) || is_object($str)) {
        echo '<pre>';
        print_r($str);
        echo '</pre>';
    } else {
        echo $str;
    }
}
//--------------------------------------------------------------------
$subject  = '12323abcdea1233';
$pattern = '/(a)(b)(c)(d)(e)/';
preg_match_all($pattern, $subject, $matches);
show($matches);
//那么你會覺得 $matches 會是什么答案?
//你肯定知道是:
Array
(
    [0] => Array
        (
            [0] => abcde
        )

    [1] => Array
        (
            [0] => a
        )

    [2] => Array
        (
            [0] => b
        )

    [3] => Array
        (
            [0] => c
        )

    [4] => Array
        (
            [0] => d
        )

    [5] => Array
        (
            [0] => e
        )

)
//這個答案如绸,大家應(yīng)該都知道吧嘱朽。索引為0的是整個match的內(nèi)容,接著的
//就是捕獲的每一個()分組的內(nèi)容竭沫。我們還可以這樣來寫:

$subject = '123abcabc123';
$pattern = '/(a)(b)(c)(\1)(\2)(\3)/';
preg_match_all($pattern, $subject, $matches);
show($matches);//??
先看答案:
Array
(
    [0] => Array
        (
            [0] => abcabc
        )

    [1] => Array
        (
            [0] => a
        )

    [2] => Array
        (
            [0] => b
        )

    [3] => Array
        (
            [0] => c
        )

    [4] => Array
        (
            [0] => a
        )

    [5] => Array
        (
            [0] => b
        )

    [6] => Array
        (
            [0] => c
        )

)
//你可能會有疑問燥翅, 咦,,, 怎么(\1)和(a), (\2)和(b)蜕提,(\3)和(c) 在正則里是一樣的呢森书?
//其實 (a)就是指的第一組, 然后后面就可以用(\1)來表示。(b),(c)也一樣谎势。

有人可能就會問了凛膏, 那你寫這個的作用又是什么呢 ? 獲取這些括號里的干啥脏榆。猖毫。 我只要第一個索引的匹配就夠了呀。

但是须喂, 你考慮到了替換這個因素沒吁断? 如果我替換的時候需要()的東西呢? 這個時候坞生,我們就可以用到捕獲到的()的東西來穿插仔役。

不知道有人好奇過沒,為什么用那些TP框架是己,Laravel框架又兵, 或者smarty
在模版里寫的{{$msg}}為什么也能輸出呢?
其實就是用了正則替換~ 看代碼:

$msg = "正則捕獲";
$subject = '<p>{{$msg}}</p>';
$pattern = '/\{\{(.*/)\}\}/';  //因為正則里也有'{' 和'}'所以需要用‘\’轉(zhuǎn)義
$result = preg_replace($pattern, '<?php echo $1; ?>', $subject);
show($result); // <p><?php echo $msg;?></p> 
//成功修改~

上面說的是捕獲, 但是我可能不想捕獲怎么辦沛厨? 那么就可以用(?:)
在前面加上?:即可宙地。注意, 這個不會影響匹配 只會影響捕獲逆皮。
如:

$subject = 'abc';
$pattern = '/(a)(?:b)(c)/';
preg_match_all($pattern, $subject, $matches);
show($matches);
//結(jié)果:
Array
(
    [0] => Array
        (
            [0] => abc
        )

    [1] => Array
        (
            [0] => a
        )

    [2] => Array
        (
            [0] => c
        )
)
//看 匹配的結(jié)果讓然是'abc' 不過沒有捕獲到 'b'

以上就是基本的難點了宅粥, 純手打和個人想法寫完~ 謝謝觀看,歡迎吐槽页屠!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粹胯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辰企,更是在濱河造成了極大的恐慌风纠,老刑警劉巖起宽,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赦颇,死亡現(xiàn)場離奇詭異蓬痒,居然都是意外死亡舌涨,警方通過查閱死者的電腦和手機斩例,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門羞延,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拷淘,“玉大人撇他,你說我怎么就攤上這事竹习√芘祝” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵整陌,是天一觀的道長拗窃。 經(jīng)常有香客問我,道長泌辫,這世上最難降的妖魔是什么随夸? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮震放,結(jié)果婚禮上宾毒,老公的妹妹穿的比我還像新娘。我一直安慰自己殿遂,他們只是感情好诈铛,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著墨礁,像睡著了一般癌瘾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饵溅,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音妇萄,去河邊找鬼蜕企。 笑死咬荷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的轻掩。 我是一名探鬼主播幸乒,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唇牧!你這毒婦竟也來了罕扎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤丐重,失蹤者是張志新(化名)和其女友劉穎腔召,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扮惦,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡臀蛛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了崖蜜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浊仆。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖豫领,靈堂內(nèi)的尸體忽然破棺而出抡柿,到底是詐尸還是另有隱情,我是刑警寧澤等恐,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布洲劣,位于F島的核電站,受9級特大地震影響鼠锈,放射性物質(zhì)發(fā)生泄漏闪檬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一购笆、第九天 我趴在偏房一處隱蔽的房頂上張望粗悯。 院中可真熱鬧,春花似錦同欠、人聲如沸样傍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衫哥。三九已至,卻和暖如春襟锐,著一層夾襖步出監(jiān)牢的瞬間撤逢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚊荣,地道東北人初狰。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像互例,于是被迫代替她去往敵國和親奢入。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容