国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

PHP開(kāi)發(fā)基礎(chǔ)教程之正則表達(dá)式中的模式修正符

一、問(wèn)題引入

我們通過(guò)元字符和原子完成了正則表達(dá)示的入門(mén)。有一些特殊情況我們依然需要來(lái)處理。

如果abc在第二行的開(kāi)始處如何匹配?
我不希望正則表達(dá)示特別貪婪的匹配全部,只匹配一部份怎么辦?

這個(gè)時(shí)候,我們就需要用到下面的這些模式匹配來(lái)增強(qiáng)正則的功能。

常用的模式匹配符有:

23.png

模式匹配符的用法如下:

/ 正則表達(dá)示/模式匹配符

模式匹配符是放在這句話的最后的。例如:

/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 視為多行

正則在匹配的時(shí)候,要匹配的目標(biāo)字符串我們通常視為一行。

“行起始”元字符(^)僅僅匹配字符串的起始,“行結(jié)束”元字符($)僅僅匹配字符串的結(jié)束。

當(dāng)設(shè)定了此修正符,“行起始”和“行結(jié)束”除了匹配整個(gè)字符串開(kāi)頭和結(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é)果:

如右所示

匹配成功了。/^ad+/ 匹配的內(nèi)容是a9,必須得在行開(kāi)始處。在第二行也被匹配成功了。

四、s 視為一行

如果設(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)有匹配到';
}
?>

第二次,在正則表達(dá)示后面加上模式匹配符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忽略空白字符。

而第二句話從字面上比較難理解,

<?php
//重點(diǎ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é)果也匹配成功了!

結(jié)論:我們發(fā)現(xiàn),x的第二個(gè)特性是忽略:#字符和下一個(gè)換行符之間的字符也被忽略。

六、e 將匹配項(xiàng)找出來(lái),進(jìn)行替換

  • ?e模式也叫逆向引用。主要的功能是將正則表達(dá)式括號(hào)里的內(nèi)容取出來(lái),放到替換項(xiàng)里面替換原字符串。

  • 使用這個(gè)模式匹配符前必須要使用到preg_replace()。

?mixed preg_replace ( mixed $正則匹配項(xiàng) , mixed $替換項(xiàng) , mixed $查找字符串)

  • ?preg_replace的功能:使用$正則匹配項(xiàng)變,找到$查找字符串變量。然后用$替換項(xiàng)變量進(jìn)行替換。

在正式講解前我們回顧一下之前的知識(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í)候:匹配到的內(nèi)容外面有括號(hào)。會(huì)把括號(hào)里面的內(nèi)容,也放到數(shù)組的元素里面。如圖中的:987、abc、321。

我們接下來(lái)看正則表達(dá)示中的e模式:

<?php
$string = "{April 15, 2003}";
//'w'匹配字母,數(shù)字和下劃線,'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);
?>

觀察右邊結(jié)果

結(jié)論:

上例中$2 指向的是正則表達(dá)示的第一個(gè)(d+)。相當(dāng)于把15又取出來(lái)了

替換的時(shí)候,我寫(xiě)上$2。將匹配項(xiàng)取出來(lái),用來(lái)再次替換匹配的結(jié)果。

七、U 貪婪模式控制

正則表達(dá)式默認(rèn)是貪婪的,也就是盡可能的最大限度匹配。

我們來(lái)看看正則表達(dá)示是如何貪婪的:

<?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)行了最大范圍的匹配。

同樣一段代碼我們?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)有匹配到';
}
?>

觀察輸出結(jié)果:

我們發(fā)現(xiàn),只匹配出來(lái)了:

<div>你好</div>

這樣,把正則的貪婪特性取消掉。讓它找到了最近的匹配,就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é)論:

如果加A模式修正符的時(shí)候匹配不出來(lái)$string,不加時(shí)能匹配出來(lái)

如果加上了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è)字符是換行符的話,美元符號(hào)也會(huì)匹配此字符之前。

<?php
$pattern = '/\w+this$/';
 //$pattern1 = '/\w+this$/D';
$string = "hellothis ";
 if (preg_match($pattern, $string, $match))
{ echo '匹配到了,結(jié)果為:'; var_dump($match); }
else
{ echo '沒(méi)有匹配到'; }
?>

結(jié)果如右所示

結(jié)論:

1.如pattern 在匹配$string的時(shí)候,$string的字符串this后有一個(gè)回車(chē)。在沒(méi)有加D匹配符的時(shí)候也能匹配成功

2.如pattern 在匹配$string的時(shí)候,加上了D。$string的字符串this后有空格,匹配不成功。

繼續(xù)學(xué)習(xí)
||
<?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)有匹配到'; } ?>
提交重置代碼