從正則表達式的iUs說說模式修正符

本想作個簡單的採集程序,發現被抓頁面代碼的規律後發現抓下來的內容沒有放到一個數組中,而是放在一個元素中,無奈找遍資料發如今正則表達式後加上」/iUs」後居然能夠了。php

網上關於iUs的說明多數都是抄襲的,沒有作過多的解釋,對於一個小學畢業證是買來的人來講是在是很差理解。不過幸好Google讓我找到答案。正則表達式

「iUs」 在這裏叫「模式修正符」。模式修正符其實就是幾個字母,能夠一次使用一個也能夠一次使用多個,每個都具備必定的意義,模式修正符是對正則表達式的擴展;「/模式修正符」,其中正斜線「/」爲邊界符。下表列出來有那些模式修正符:數組

 

模式修正符 說明
i 表示在和模式進行匹配進不區分大小寫
m 將模式視爲多行,使用^和$表示任何一行均可以以正則表達式開始或結束
s 若是沒有使用這個模式修正符號,元字符中的」.」默認不能表示換行符號,將字符串視爲單行
x 表示模式中的空白忽略不計
e 正則表達式必須使用在preg_replace替換字符串的函數中時纔可使用(講這個函數時再說)
A 以模式字符串開頭,至關於元字符^
Z 以模式字符串結尾,至關於元字符$
U 正則表達式的特色:就是比較「貪婪」,使用該模式修正符能夠取消貪婪模式

1,模式修正符m。函數

<?php
$pattern = ‘/^abc/m’;
$string = ‘bcd
abc
cba’;
if (preg_match($pattern, $string, $arr)) {
echo 「正則表達式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>」;
print_r($arr);
} else {
echo 「<font color=’red’>正則表達式{$pattern}和字符串{$string}匹配失敗</font>」;
}
?>spa

匹配結果是成功的。注意:咱們在使用模式修正符m的時候,將匹配字符串當作是多行而不是默認的單行,因此任何一行只要是以abc開頭,就匹配成功。可是,若是能匹配的行前面有空格的話,就不能匹配了!除非修改正則表達式的匹配模式。ci

2,模式修正符s。字符串

<?php
$pattern = ‘/a.*c/s’;
$string = ‘adsadsa
c’;
if (preg_match($pattern, $string, $arr)) {
echo 「正則表達式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>」;
print_r($arr);
} else {
echo 「<font color=’red’>正則表達式{$pattern}和字符串{$string}匹配失敗</font>」;
}
?>string

此次的匹配記過也是成功的。若是你將上例中的模式修正符s去掉的話,匹配就會失敗。由於模式修正符s將匹配字符串看做是單行的,因此這個時候,元字符中的」.」就能夠表示換行符號了。table

3,模式修正符x。擴展

<?php
$pattern = ‘/a c/x’;
$string = ‘a c’;
if (preg_match($pattern, $string, $arr)) {
echo 「正則表達式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>」;
print_r($arr);
} else {
echo 「<font color=’red’>正則表達式{$pattern}和字符串{$string}匹配失敗</font>」;
}
?>

此次的匹配結果是失敗的。由於咱們使用模式修正符x取消了模式中的空格。注意:咱們沒法使用模式修正符取消\s表示的空白。

4,模式修正符A。

<?php
$pattern = ‘/ac/A’;
$string = ‘acahgyghvbm’;
if (preg_match($pattern, $string, $arr)) {
echo 「正則表達式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>」;
print_r($arr);
} else {
echo 「<font color=’red’>正則表達式{$pattern}和字符串{$string}匹配失敗</font>」;
}
?>

正則表達式表示的含義是匹配以ac開頭的字符串,結果成功。

模式修正符Z表示的是以字符串結尾的匹配,和A的用法是同樣的,咱們再也不進行演示。

5,模式修正符U。

這個模式修正符是十分重要的!在正則表達式中,其自己是「貪婪」的。那什麼是貪婪模式呢?貪婪模式的意思就是說,正則表達式默認會在查找到第一個匹配後,繼續嘗試後面的匹配,若是能找到匹配,則匹配最大的範圍字符串。但有的時候這並非咱們想要的結果,因此咱們須要取消貪婪模式。

咱們仍是先看一個貪婪模式的例子:

<?php
$pattern = ‘/<b>.*<\/b>/’;
$string = ‘<b>welcome</b> <b>to</b> <b>phpfuns</b>’;
if (preg_match($pattern, $string, $arr)) {
echo 「正則表達式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>」;
print_r($arr);
} else {
echo 「<font color=’red’>正則表達式{$pattern}和字符串{$string}匹配失敗</font>」;
}
?>

這個實例的本意是匹配welcome,可是結果卻匹配了welcome to phpfuns整個字符串(注意咱們的字符串’welcome to phpfuns’,其開頭和結尾正好構成了正則表達式的模式匹配,因此匹配成功),這就是正則表達式的貪婪模式。固然,這不是咱們要的結果。

取消貪婪模式

咱們可使用模式修正符U和元字符?兩種方式取消正則表達式的貪婪模式。

模式修正符U取消貪婪模式

<?php
$pattern = ‘/<b>.*<\/b>/U’;
$string = ‘<b>welcome</b> <b>to</b> <b>phpfuns</b>’;
if (preg_match($pattern, $string, $arr)) {
echo 「正則表達式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>」;
print_r($arr);
} else {
echo 「<font color=’red’>正則表達式{$pattern}和字符串{$string}匹配失敗</font>」;
}
?>

元字符?取消貪婪模式

<?php
$pattern = ‘/<b>.*?<\/b>/’;
$string = ‘<b>welcome</b> <b>to</b> <b>phpfuns</b>dsadsadas’;
if (preg_match($pattern, $string, $arr)) {
echo 「正則表達式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>」;
print_r($arr);
} else {
echo 「<font color=’red’>正則表達式{$pattern}和字符串{$string}匹配失敗</font>」;
}
?>

注意元字符的位置,咱們必須在「」以前結束貪婪模式,才能達到咱們的目的

相關文章
相關標籤/搜索