模式比對 | 功能 |
i | 模式中的字元將同時匹配大小寫字母. |
#m | 字串視為多行 |
s | 將字串視為單行,換行符號作為普通字元. |
##x | 將模式中的空白忽略. |
A | 強制僅從目標字串的開頭開始匹配. |
D | 模式中的美元元字元僅符合目標字串的結尾. |
U | #符合最近的字串. |
模式匹配符的用法如下:
/ 正規表示示/模式匹配
#模式匹配是放在這句話的最後的。例如:
/\w+/s
格式我們清楚了,接下來最主要的是加強對於模式匹配符使用的理解和記憶。我們透過程式碼來理解加上和不加模式匹配符有何區別。
i 不區分大小寫
<?php //在后面加上了一个i
$pattern = '/ABC/i';
$string = '8988abc12313';
$string1 = '11111ABC2222';
if(preg_match($pattern, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches); }else{
echo '没有匹配到';
}
?>
結論,不論是$string還是$string1全都匹配成功了。因此,後面加上了i之後,能夠不共分出匹配內容的大小寫。
m 視為多行
正規在符合的時候,要符合的目標字串我們通常會視為一行。
「行起始」元字元(^)只是符合字串的起始,「行結束」元字元($)只是符合字串的結束。
當設定了此修正符,除了符合整個字串開頭和結束「行起始」和「行結束」外,還分別符合其中的換行符的之後和之前。
注意:如果要匹配的字串中沒有「\n」字元或模式中沒有 ^ 或 $,則設定此修正符沒有任何效果。
我們透過實驗和程式碼來驗證這個特點:
第一次匹配,你會發現匹配不成功:
<?php
$pattern = '/^a\d+/';
$string = "我的未来在自己手中我需要不断的努力
a9是一个不错的字符表示
怎么办呢,其实需要不断奋进";
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
}
?>
第二次匹配,我們加上m 試試看:
<?php
$pattern = '/^a\d+/m';
$string = "我的未来在自己手中我需要不断的努力
a9是一个不错的字符表示
怎么办呢,其实需要不断奋进";
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
}
?>
結果:
喔耶!匹配成功了。 /^a\d+/ 相符的內容是a9,必須得在行開始處。在第二行也被配對成功了。
s 識為一行
如果設定了此修正符,模式中的圓點元字符(.)匹配所有的字符,包括換行符。
第一次,不加模式匹配s:
<?php
$pattern = '/新的未来.+\d+/';
$string = '新的未来
987654321';
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
}
?>
第二次,在正規表示示後面加上模式匹配s:
<?php
$pattern = '/新的未来.+\d+/s';
$string = "新的未来
987654321";
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
}
?>
結果如下,匹配成功!
結論:
1.因為在新的未來,未來後面有一個換行
2.而.(點)是匹配非空白字元以外的所有字元。因此,第一次不成功
3.第二次,加上了s模式匹配符。因為,加上後.(點)能匹配所有字元。
x 忽略空白字元
1.如果設定了此修正符,模式中的空白字元除了被轉義的或在字元類別中的以外完全被忽略。
2.未轉義的字元類別外部的#字元和下一個換行符之間的字元也被忽略。
我們先來實驗一下忽略空白行等特性:
<?php
$pattern = '/a b c /x';
$string = '学英语要从abc开始';
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
}
?>
這樣也能匹配成功。
在$pattern裡面有空格,每個abc後面都有一個空格。而$string裡面沒有空格。
所以x忽略空白字元。
而第二句話從字面上比較難理解,
<?php
//重点观察这一行
$pattern = '/a b c #我来写一个注释
/x';
$string = '学英语要从abc开始';
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
}
?>
結果也匹配成功了!
我們發現,x的第二個特性是忽略:#字元和下一個換行符號之間的字元也被忽略。
e 將匹配項找出來,進行替換
mixed preg_replace ( mixed $正規匹配項, mixed $替換項目, mixed $查找字串)
在正式講解前我們回顧一下之前的知識,我們故意的把每個要匹配的原子外面都加上括號:
<?php
//加上了括号
$pattern = '/(\d+)([a-z]+)(\d+)/';
$string = '987abc321';
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
} else {
echo '没有匹配到';
}
?>
我們來看看結果:
這是我們之前講括號的時候:配對到的內容外面有括號。會把括號裡面的內容,也放到陣列的元素裡面。如圖中的:987、abc、321。
我們接下來看正規表示顯示中的e模式:
<?php
$string = "{April 15, 2003}";
//'w'匹配字母,数字和下划线,'d'匹配0-99数字,'+'元字符规定其前导字符必须在目标对象中连续出现一次或多次
$pattern = "/{(\w+) (\d+), (\d+)}/i";
$replacement = "$2";
//字符串被替换为与第 n 个被捕获的括号内的子模式所匹配的文本
echo preg_replace($pattern, $replacement, $string);
?>
我們來看看執行結果:
結論:
上例中\$2 指向的是正規表示示的第一個(\d+)。相當於把15又取出來了
替換的時候,我寫上\$2。將匹配項取出來,用來再次替換匹配的結果。
U 貪婪模式控制
正規表示式預設是貪婪的,也就是盡可能的最大限度匹配。
我們來看看正規表示顯示是如何貪婪的:
<?php
$pattern = '/<div>.*<\/div>/';
$string = "<div>你好</div><div>我是</div>";
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
} else {
echo '没有匹配到';
}
?>
我們來看看結果,得到以下結論。它從“
你好”直接匹配到了“我是
”。進行了最大範圍的匹配。
同樣一段程式碼我們再加大寫的U,再看看效果:
<?php
$pattern = '/<div>.*<\/div>/U';
$string = "<div>你好</div><div>我是</div>";
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
} else {
echo '没有匹配到';
}
?>
#我們發現,只匹配出來了:
<div>你好</div>
這樣,把正規的貪婪特性取消掉。讓它找到了最近的匹配,就OK了。
A 從目標字串的開頭開始匹配
#此模式類似於元字元中的^(抑揚符)效果。
<?php
$pattern = '/this/A';
$string = 'hello this is a ';
//$string1 = 'this is a ';
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
} else {
echo '没有匹配到';
}
?>
結論:
1.如果加上A模式修正符號的時候配對不出來$string,不加時能配對出來
## 2.如果加上了A模式修正符的時候可以匹配出來$string1,因為必須從開始處開始匹配D 結束$符後不准有回車
如果設定了此修正符,模式中的美元元字元僅匹配目標字串的結尾。沒有此選項時,如果最後一個字元是換行符的話,美元符號也會匹配此字元之前。 <?php
$pattern = '/\w+this$/';
$pattern1 = '/\w+this$/D';
$string = "hellothis ";
if (preg_match($pattern1, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
}else {
echo '没有匹配到';
}
?>
結論: 1.如pattern 在符合$string的時候,$string的字串this後面有一個回車。在沒有加D匹配的時候也能匹配成功 2.如pattern 在匹配$string的時候,加上了D。 $string的字串this後面有空格,匹配不成功。
下一節
<?php
$pattern = '/this/A';
$string = 'hello this is a ';
//$string1 = 'this is a ';
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
} else {
echo '没有匹配到';
}
?>