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

php 正規(guī)達(dá)達(dá)示中的模式修正符

我們透過元字元和原子完成了正規(guī)表示示的入門。有一些特殊情況我們依然需要來處理。

如果abc在第二行的開始處如何匹配?
我不希望正規(guī)表示示特別貪婪的配對全部,只符合一部分怎麼辦?

這個時候,我們就需要用到下面的這些模式匹配來增強(qiáng)正規(guī)的功能。

常用的模式比對有:

##x將模式中的空白忽略.A強(qiáng)制僅從目標(biāo)字串的開頭開始匹配.D模式中的美元元字元僅符合目標(biāo)字串的結(jié)尾.U#符合最近的字串.

模式匹配符的用法如下:

/ 正規(guī)表示示/模式匹配

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

/\w+/s

格式我們清楚了,接下來最主要的是加強(qiáng)對於模式匹配符使用的理解和記憶。我們透過程式碼來理解加上和不加模式匹配符有何區(qū)別。

i 不區(qū)分大小寫

<?php //在后面加上了一個i 
    $pattern = '/ABC/i'; 
$string = '8988abc12313';
$string1 = '11111ABC2222'; 
if(preg_match($pattern, $string, $matches)){
     echo '匹配到了,結(jié)果為:'; 
    var_dump($matches); }else{
     echo '沒有匹配到';
     }
 ?>

結(jié)論,不論是$string還是$string1全都匹配成功了。因此,後面加上了i之後,能夠不共分出匹配內(nèi)容的大小寫。

m 視為多行

正規(guī)在符合的時候,要符合的目標(biāo)字串我們通常會視為一行。

「行起始」元字元(^)只是符合字串的起始,「行結(jié)束」元字元($)只是符合字串的結(jié)束。

當(dāng)設(shè)定了此修正符,除了符合整個字串開頭和結(jié)束「行起始」和「行結(jié)束」外,還分別符合其中的換行符的之後和之前。

注意:如果要匹配的字串中沒有「\n」字元或模式中沒有 ^ 或 $,則設(shè)定此修正符沒有任何效果。

我們透過實驗和程式碼來驗證這個特點:

第一次匹配,你會發(fā)現(xiàn)匹配不成功:

<?php
$pattern = '/^a\d+/';
$string = "我的未來在自己手中我需要不斷的努力
a9是一個不錯的字符表示
怎么辦呢,其實需要不斷奮進(jìn)";
if (preg_match($pattern, $string, $matches)) {
    echo '匹配到了,結(jié)果為:';
    var_dump($matches);
} else {
    echo '沒有匹配到';
}
?>

第二次匹配,我們加上m 試試看:

<?php
$pattern = '/^a\d+/m';
$string = "我的未來在自己手中我需要不斷的努力
a9是一個不錯的字符表示
怎么辦呢,其實需要不斷奮進(jìn)";
if (preg_match($pattern, $string, $matches)) {
    echo '匹配到了,結(jié)果為:';
    var_dump($matches);
} else {
    echo '沒有匹配到';
}
?>

結(jié)果:

QQ截圖20161114141159.png

喔耶!匹配成功了。 /^a\d+/ 相符的內(nèi)容是a9,必須得在行開始處。在第二行也被配對成功了。

s 識為一行

如果設(shè)定了此修正符,模式中的圓點元字符(.)匹配所有的字符,包括換行符。

第一次,不加模式匹配s:

<?php

$pattern = '/新的未來.+\d+/';

$string = '新的未來
987654321';

if (preg_match($pattern, $string, $matches)) {
   echo '匹配到了,結(jié)果為:';
   var_dump($matches);
} else {
   echo '沒有匹配到';
}

?>

第二次,在正規(guī)表示示後面加上模式匹配s:

<?php

$pattern = '/新的未來.+\d+/s';

$string = "新的未來
987654321";

if (preg_match($pattern, $string, $matches)) {
   echo '匹配到了,結(jié)果為:';
   var_dump($matches);
} else {
   echo '沒有匹配到';
}

?>

結(jié)果如下,匹配成功!

QQ截圖20161114141235.png

結(jié)論:

????1.因為在新的未來,未來後面有一個換行

????2.而.(點)是匹配非空白字元以外的所有字元。因此,第一次不成功

????3.第二次,加上了s模式匹配符。因為,加上後.(點)能匹配所有字元。

x 忽略空白字元

????1.如果設(shè)定了此修正符,模式中的空白字元除了被轉(zhuǎn)義的或在字元類別中的以外完全被忽略。

????2.未轉(zhuǎn)義的字元類別外部的#字元和下一個換行符之間的字元也被忽略。

我們先來實驗一下忽略空白行等特性:

<?php

$pattern = '/a b c /x';

$string = '學(xué)英語要從abc開始';

if (preg_match($pattern, $string, $matches)) {
   echo '匹配到了,結(jié)果為:';
   var_dump($matches);
} else {
   echo '沒有匹配到';
}

?>

這樣也能匹配成功。

QQ截圖20161114141325.png

在$pattern裡面有空格,每個abc後面都有一個空格。而$string裡面沒有空格。
所以x忽略空白字元。

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

<?php
//重點觀察這一行
$pattern = '/a b c #我來寫一個注釋
/x';

$string = '學(xué)英語要從abc開始';

if (preg_match($pattern, $string, $matches)) {
   echo '匹配到了,結(jié)果為:';
   var_dump($matches);
} else {
   echo '沒有匹配到';
}

?>

結(jié)果也匹配成功了!

QQ截圖20161114141359.png

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

e 將匹配項找出來,進(jìn)行替換

  • e模式也叫逆向引用。主要的功能是將正規(guī)表示式括號裡的內(nèi)容取出來,放到替換項目裡面替換原字串。

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

????mixed preg_replace ( mixed $正規(guī)匹配項, mixed $替換項目, mixed $查找字串)

  • # preg_replace的功能:使用$正規(guī)符合項變,找出$找出字串變數(shù)。然後用$替換項變數(shù)進(jìn)行替換。

在正式講解前我們回顧一下之前的知識,我們故意的把每個要匹配的原子外面都加上括號:

<?php
//加上了括號
$pattern = '/(\d+)([a-z]+)(\d+)/';

$string = '987abc321';

if (preg_match($pattern, $string, $match)) {
   echo '匹配到了,結(jié)果為:';
   var_dump($match);

} else {
   echo '沒有匹配到';
}
?>

我們來看看結(jié)果:

QQ截圖20161114141456.png

這是我們之前講括號的時候:配對到的內(nèi)容外面有括號。會把括號裡面的內(nèi)容,也放到陣列的元素裡面。如圖中的:987、abc、321。

我們接下來看正規(guī)表示顯示中的e模式:

<?php
$string = "{April 15, 2003}";

//'w'匹配字母,數(shù)字和下劃線,'d'匹配0-99數(shù)字,'+'元字符規(guī)定其前導(dǎo)字符必須在目標(biāo)對象中連續(xù)出現(xiàn)一次或多次
$pattern = "/{(\w+) (\d+), (\d+)}/i";

$replacement = "$2";

//字符串被替換為與第 n 個被捕獲的括號內(nèi)的子模式所匹配的文本
echo preg_replace($pattern, $replacement, $string);

?>

我們來看看執(zhí)行結(jié)果:

QQ截圖20161114141532.png

結(jié)論:

上例中\(zhòng)$2 指向的是正規(guī)表示示的第一個(\d+)。相當(dāng)於把15又取出來了

替換的時候,我寫上\$2。將匹配項取出來,用來再次替換匹配的結(jié)果。

U 貪婪模式控制

正規(guī)表示式預(yù)設(shè)是貪婪的,也就是盡可能的最大限度匹配。

我們來看看正規(guī)表示顯示是如何貪婪的:

<?php
$pattern = '/<div>.*<\/div>/';

$string = "<div>你好</div><div>我是</div>";

if (preg_match($pattern, $string, $match)) {
   echo '匹配到了,結(jié)果為:';
   var_dump($match);
} else {
   echo '沒有匹配到';
}

?>

我們來看看結(jié)果,得到以下結(jié)論。它從“

你好”直接匹配到了“我是

”。進(jìn)行了最大範(fàn)圍的匹配。

QQ截圖20161114141617.png

同樣一段程式碼我們再加大寫的U,再看看效果:

<?php
$pattern = '/<div>.*<\/div>/U';

$string = "<div>你好</div><div>我是</div>";

if (preg_match($pattern, $string, $match)) {
   echo '匹配到了,結(jié)果為:';
   var_dump($match);
} else {
   echo '沒有匹配到';
}

?>

QQ截圖20161114141652.png

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

<div>你好</div>

這樣,把正規(guī)的貪婪特性取消掉。讓它找到了最近的匹配,就OK了。

A 從目標(biāo)字串的開頭開始匹配

#此模式類似於元字元中的^(抑揚(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 '沒有匹配到';
}

?>

結(jié)論:

????1.如果加上A模式修正符號的時候配對不出來$string,不加時能配對出來

##????2.如果加上了A模式修正符的時候可以匹配出來$string1,因為必須從開始處開始匹配

D 結(jié)束$符後不準(zhǔn)有回車

如果設(shè)定了此修正符,模式中的美元元字元僅匹配目標(biāo)字串的結(jié)尾。沒有此選項時,如果最後一個字元是換行符的話,美元符號也會匹配此字元之前。

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

結(jié)論:

????1.如pattern 在符合$string的時候,$string的字串this後面有一個回車。在沒有加D匹配的時候也能匹配成功

????2.如pattern 在匹配$string的時候,加上了D。 $string的字串this後面有空格,匹配不成功。


繼續(xù)學(xué)習(xí)

||
<?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 '沒有匹配到'; } ?>
提交重置程式碼
模式比對功能
i模式中的字元將同時匹配大小寫字母.
#m字串視為多行
s將字串視為單行,換行符號作為普通字元.
<samp id="yomuk"></samp>