模式比對(duì) | 功能 |
i | 模式中的字元將同時(shí)匹配大小寫(xiě)字母. |
#m | 字串視為多行 |
s | 將字串視為單行,換行符號(hào)作為普通字元. |
##x | 將模式中的空白忽略. |
A | 強(qiáng)制僅從目標(biāo)字串的開(kāi)頭開(kāi)始匹配. |
D | 模式中的美元元字元僅符合目標(biāo)字串的結(jié)尾. |
U | #符合最近的字串. |
模式匹配符的用法如下:
/ 正規(guī)表示示/模式匹配
#模式匹配是放在這句話(huà)的最後的。例如:
/\w+/s
格式我們清楚了,接下來(lái)最主要的是加強(qiáng)對(duì)於模式匹配符使用的理解和記憶。我們透過(guò)程式碼來(lái)理解加上和不加模式匹配符有何區(qū)別。
i 不區(qū)分大小寫(xiě)
<?php //在后面加上了一個(gè)i
$pattern = '/ABC/i';
$string = '8988abc12313';
$string1 = '11111ABC2222';
if(preg_match($pattern, $string, $matches)){
echo '匹配到了,結(jié)果為:';
var_dump($matches); }else{
echo '沒(méi)有匹配到';
}
?>
結(jié)論,不論是$string還是$string1全都匹配成功了。因此,後面加上了i之後,能夠不共分出匹配內(nèi)容的大小寫(xiě)。
m 視為多行
正規(guī)在符合的時(shí)候,要符合的目標(biāo)字串我們通常會(huì)視為一行。
「行起始」元字元(^)只是符合字串的起始,「行結(jié)束」元字元($)只是符合字串的結(jié)束。
當(dāng)設(shè)定了此修正符,除了符合整個(gè)字串開(kāi)頭和結(jié)束「行起始」和「行結(jié)束」外,還分別符合其中的換行符的之後和之前。
注意:如果要匹配的字串中沒(méi)有「\n」字元或模式中沒(méi)有 ^ 或 $,則設(shè)定此修正符沒(méi)有任何效果。
我們透過(guò)實(shí)驗(yàn)和程式碼來(lái)驗(yàn)證這個(gè)特點(diǎn):
第一次匹配,你會(huì)發(fā)現(xiàn)匹配不成功:
<?php
$pattern = '/^a\d+/';
$string = "我的未來(lái)在自己手中我需要不斷的努力
a9是一個(gè)不錯(cuò)的字符表示
怎么辦呢,其實(shí)需要不斷奮進(jìn)";
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,結(jié)果為:';
var_dump($matches);
} else {
echo '沒(méi)有匹配到';
}
?>
第二次匹配,我們加上m 試試看:
<?php
$pattern = '/^a\d+/m';
$string = "我的未來(lái)在自己手中我需要不斷的努力
a9是一個(gè)不錯(cuò)的字符表示
怎么辦呢,其實(shí)需要不斷奮進(jìn)";
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,結(jié)果為:';
var_dump($matches);
} else {
echo '沒(méi)有匹配到';
}
?>
結(jié)果:

喔耶!匹配成功了。 /^a\d+/ 相符的內(nèi)容是a9,必須得在行開(kāi)始處。在第二行也被配對(duì)成功了。
s 識(shí)為一行
如果設(shè)定了此修正符,模式中的圓點(diǎn)元字符(.)匹配所有的字符,包括換行符。
第一次,不加模式匹配s:
<?php
$pattern = '/新的未來(lái).+\d+/';
$string = '新的未來(lái)
987654321';
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,結(jié)果為:';
var_dump($matches);
} else {
echo '沒(méi)有匹配到';
}
?>
第二次,在正規(guī)表示示後面加上模式匹配s:
<?php
$pattern = '/新的未來(lái).+\d+/s';
$string = "新的未來(lái)
987654321";
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,結(jié)果為:';
var_dump($matches);
} else {
echo '沒(méi)有匹配到';
}
?>
結(jié)果如下,匹配成功!

結(jié)論:
????1.因?yàn)樵谛碌奈磥?lái),未來(lái)後面有一個(gè)換行
????2.而.(點(diǎn))是匹配非空白字元以外的所有字元。因此,第一次不成功
????3.第二次,加上了s模式匹配符。因?yàn)?,加上?(點(diǎn))能匹配所有字元。
x 忽略空白字元
????1.如果設(shè)定了此修正符,模式中的空白字元除了被轉(zhuǎn)義的或在字元類(lèi)別中的以外完全被忽略。
????2.未轉(zhuǎn)義的字元類(lèi)別外部的#字元和下一個(gè)換行符之間的字元也被忽略。
我們先來(lái)實(shí)驗(yàn)一下忽略空白行等特性:
<?php
$pattern = '/a b c /x';
$string = '學(xué)英語(yǔ)要從abc開(kāi)始';
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,結(jié)果為:';
var_dump($matches);
} else {
echo '沒(méi)有匹配到';
}
?>
這樣也能匹配成功。

在$pattern裡面有空格,每個(gè)abc後面都有一個(gè)空格。而$string裡面沒(méi)有空格。
所以x忽略空白字元。
而第二句話(huà)從字面上比較難理解,
<?php
//重點(diǎn)觀(guān)察這一行
$pattern = '/a b c #我來(lái)寫(xiě)一個(gè)注釋
/x';
$string = '學(xué)英語(yǔ)要從abc開(kāi)始';
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,結(jié)果為:';
var_dump($matches);
} else {
echo '沒(méi)有匹配到';
}
?>
結(jié)果也匹配成功了!

我們發(fā)現(xiàn),x的第二個(gè)特性是忽略:#字元和下一個(gè)換行符號(hào)之間的字元也被忽略。
e 將匹配項(xiàng)找出來(lái),進(jìn)行替換
????mixed preg_replace ( mixed $正規(guī)匹配項(xiàng), mixed $替換項(xiàng)目, mixed $查找字串)
在正式講解前我們回顧一下之前的知識(shí),我們故意的把每個(gè)要匹配的原子外面都加上括號(hào):
<?php
//加上了括號(hào)
$pattern = '/(\d+)([a-z]+)(\d+)/';
$string = '987abc321';
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,結(jié)果為:';
var_dump($match);
} else {
echo '沒(méi)有匹配到';
}
?>
我們來(lái)看看結(jié)果:

這是我們之前講括號(hào)的時(shí)候:配對(duì)到的內(nèi)容外面有括號(hào)。會(huì)把括號(hào)裡面的內(nèi)容,也放到陣列的元素裡面。如圖中的:987、abc、321。
我們接下來(lái)看正規(guī)表示顯示中的e模式:
<?php
$string = "{April 15, 2003}";
//'w'匹配字母,數(shù)字和下劃線(xiàn),'d'匹配0-99數(shù)字,'+'元字符規(guī)定其前導(dǎo)字符必須在目標(biāo)對(duì)象中連續(xù)出現(xiàn)一次或多次
$pattern = "/{(\w+) (\d+), (\d+)}/i";
$replacement = "$2";
//字符串被替換為與第 n 個(gè)被捕獲的括號(hào)內(nèi)的子模式所匹配的文本
echo preg_replace($pattern, $replacement, $string);
?>
我們來(lái)看看執(zhí)行結(jié)果:

結(jié)論:
上例中\(zhòng)$2 指向的是正規(guī)表示示的第一個(gè)(\d+)。相當(dāng)於把15又取出來(lái)了
替換的時(shí)候,我寫(xiě)上\$2。將匹配項(xiàng)取出來(lái),用來(lái)再次替換匹配的結(jié)果。
U 貪婪模式控制
正規(guī)表示式預(yù)設(shè)是貪婪的,也就是盡可能的最大限度匹配。
我們來(lái)看看正規(guī)表示顯示是如何貪婪的:
<?php
$pattern = '/<div>.*<\/div>/';
$string = "<div>你好</div><div>我是</div>";
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,結(jié)果為:';
var_dump($match);
} else {
echo '沒(méi)有匹配到';
}
?>
我們來(lái)看看結(jié)果,得到以下結(jié)論。它從“
你好”直接匹配到了“我是
”。進(jìn)行了最大範(fàn)圍的匹配。

同樣一段程式碼我們?cè)偌哟髮?xiě)的U,再看看效果:
<?php
$pattern = '/<div>.*<\/div>/U';
$string = "<div>你好</div><div>我是</div>";
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,結(jié)果為:';
var_dump($match);
} else {
echo '沒(méi)有匹配到';
}
?>

#我們發(fā)現(xiàn),只匹配出來(lái)了:
<div>你好</div>
這樣,把正規(guī)的貪婪特性取消掉。讓它找到了最近的匹配,就OK了。
A 從目標(biāo)字串的開(kāi)頭開(kāi)始匹配
#此模式類(lèi)似於元字元中的^(抑揚(yáng)符)效果。
<?php
$pattern = '/this/A';
$string = 'hello this is a ';
//$string1 = 'this is a ';
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,結(jié)果為:';
var_dump($match);
} else {
echo '沒(méi)有匹配到';
}
?>
結(jié)論:
????1.如果加上A模式修正符號(hào)的時(shí)候配對(duì)不出來(lái)$string,不加時(shí)能配對(duì)出來(lái)
##????2.如果加上了A模式修正符的時(shí)候可以匹配出來(lái)$string1,因?yàn)楸仨殢拈_(kāi)始處開(kāi)始匹配D 結(jié)束$符後不準(zhǔn)有回車(chē)
如果設(shè)定了此修正符,模式中的美元元字元僅匹配目標(biāo)字串的結(jié)尾。沒(méi)有此選項(xiàng)時(shí),如果最後一個(gè)字元是換行符的話(huà),美元符號(hào)也會(huì)匹配此字元之前。 <?php
$pattern = '/\w+this$/';
$pattern1 = '/\w+this$/D';
$string = "hellothis ";
if (preg_match($pattern1, $string, $match)) {
echo '匹配到了,結(jié)果為:';
var_dump($match);
}else {
echo '沒(méi)有匹配到';
}
?>
結(jié)論:????1.如pattern 在符合$string的時(shí)候,$string的字串this後面有一個(gè)回車(chē)。在沒(méi)有加D匹配的時(shí)候也能匹配成功????2.如pattern 在匹配$string的時(shí)候,加上了D。 $string的字串this後面有空格,匹配不成功。
<?php
$pattern = '/this/A';
$string = 'hello this is a ';
//$string1 = 'this is a ';
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,結(jié)果為:';
var_dump($match);
} else {
echo '沒(méi)有匹配到';
}
?>
課件暫不提供下載,工作人員正在整理中,後期請(qǐng)多關(guān)注該課程~
看過(guò)本課程的同學(xué)也在學(xué)習(xí)