- 斷言
-
?<=
這個是對需要匹配的目標左邊的(前面)的進行斷言取试,斷定它前面會出現(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 !
這樣就成功咯~
-
?=
,與上面的位置剛好相反硼控,這個是對需要匹配的目標右邊的(后面)的進行斷言蚁飒,斷定它后面會出現(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!'
-
?<!
這個是需要對匹配左邊的(前面的)進行斷言,不過它是非鞍泉,找到不是這個的皱埠。還是拿第一個例子來說:
$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 !
-
?!
還是一樣的秘方,還是一樣的味道~
$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'
以上就是基本的難點了宅粥, 純手打和個人想法寫完~ 謝謝觀看,歡迎吐槽页屠!