PHP七天系列之正則表達式

正則表達式


正則表達式被用來檢索或替換那些符合某個模式的文本內容。許多程序設計語言都支持利用正則表達式進行字符串操作煎殷。例如:JavaScript屯伞、PHP、ASP豪直、JAVA劣摇、Perl、C#弓乙、.NET末融、ColdFusion钧惧、Python、Visual Basic勾习、MYSQL浓瞪、LINUX、VI編輯器等等語言都支持正則表達式巧婶。

簡單來說正則表達式就是完成字符串的增乾颁、刪、改粹舵、查钮孵。

定界符


正則表達式語句需要由分隔符(定界符)閉合包裹,分隔符可以使任意非字母數(shù)字, 非反斜線, 非空白字符

經(jīng)常使用的分隔符是正斜線(/), hash符號(#) 以及取反符號(~)眼滤。

建議使用//做為定界符,因為與js一致巴席。

$status =  preg_match('/pfinalClub/', 'pfinalClub.com');
var_dump($status);

元字符


元字符是正則表達式中的最小元素,只代表單一(一個)字符诅需。下面是元字符列表

元字符 說明 范圍
\d 匹配任意一個數(shù)字 [0-9]
\D 與除了數(shù)字以外的任何一個字符匹配 [^0-9]
\w 與任意一個英文字母,數(shù)字或下劃線匹配 [a-zA-Z_0-9]
\W 除了字母,數(shù)字或下劃線外與任何字符匹配 [^a-zA-Z_0-9]
\s 與任意一個空白字符匹配 [\n\f\r\t\v]
\S 與除了空白符外任意一個字符匹配 [^\n\f\r\t\v]
\n 換行字符
\t 制表符
var_dump(preg_match('/\d/', '1'));
var_dump(preg_match('/\D/', 'h'));
var_dump(preg_match('/\w/', '_'));
var_dump(preg_match('/\W/', '@'));
var_dump(preg_match('/\s/', ' '));
var_dump(preg_match('/\S/', 'h'));
var_dump(preg_match('/\n/', "\n"));
var_dump(preg_match('/\n/', '
'));
var_dump(preg_match('/\t/', "\t"));

元字符表(原子表)


在一組字符中匹配某個元字符漾唉,在正則表達式中通過元字符表來完成,就是放到方括號中堰塌。

原子表 說明
[] 只匹配其中的一個原子
[^] 只匹配"除了"其中字符的任意一個原子
[0-9] 匹配0-9任何一個數(shù)字
[a-z] 匹配小寫a-z任何一個字母
[A-Z] 匹配大寫A-Z任何一個字母
. 點在正則中表示除換行符外的任意字符

匹配除了678外的任何字符

$status = preg_match('/[^678]/', 678);
var_dump($status);

匹配大小寫字母

$status = preg_match('/[a-zA-Z]/', 'a');
var_dump($status);

用 . 匹配字符

$status = preg_match('/./', 'pfinalClub');
var_dump($status);

下面是通過原子表拆分字符串

$str ="1.jpg@2.jpg@3.jpg#4.jpg";
$arr = preg_split('/[@#]/',$str); //按正則表達式拆分字符串
print_r($arr); //輸出結果 Array ( [0] => 1.jpg [1] => 2.jpg [2] => 3.jpg [

原子組


  • 如果一次要匹配多個元子赵刑,可以通過元子組完成

  • 原子組與原子表的差別在于原子組一次匹配多個元子,而原子表則是匹配成功表中的一個元字符就可以

  • 元字符組用()表示

下面是使用正則表達式將pfinalclub字符中的pfinal描紅场刑。

$str = "官網(wǎng)www.pfinalclub.com 論壇http://bbs.pfinal.com般此,我在網(wǎng)名叫pfinal";
$preg = "/(pfinal)club/is";
$newStr= preg_replace($preg, '<span style="color:#f00">\1club</span>', $str);
echo $newStr;

匹配字符邊界


如果想匹配字符的邊界,邊界包括空格牵现、標點符號铐懊、換行等,可以使用正則表達式的匹配字符邊界修飾符如下瞎疼。

符號 說明
^ 匹配字符串的開始
$ 匹配字符串的結束科乎,忽略換行符
$status = preg_match('/^pfinalClub$/', 'pfinalClub');
var_dump($status); //返回真

選擇修釋符

| 這個符號帶表選擇修釋符,也就是 | 左右兩側有一個匹配到就可以贼急。
下面是通過選擇修釋符將域名修改為 pfinalClub

$str = "http://www.baidu.com與新浪網(wǎng)http://www.sina.com";
$preg = "/\.(baidu|sina)\./is";
echo preg_replace($preg, '.pfinalClub.', $str);

匹配域名后綴

$str = '來了茅茂,老弟!有問題就在 pfinalClub.com 或 pfinal.com';
$preg = '/(pfinalClub|pfinal)\.com/';
$replace = '<a href="http://www.\1.com">\1.com</a>';
echo preg_replace($preg, $replace, $str);

重復匹配


如果要重復匹配一些內容時我們要使用重復匹配修飾符太抓,包括以下幾種空闲。

因為正則最小單位是元字符,而我們很少只匹配一個元字符如a走敌、b所以基本上重復匹配在每條正則語句中都是必用到的內容碴倾。

符號 說明
* 重復零次或更多次
+ 重復一次或更多次
? 重復零次或一次
{n} 重復n次
{n,} 重復n次或更多次
{n,m} 重復n到m次
var_dump(preg_match('/^.*$/', '')); //* 零個及空字符串也是可以的
var_dump(preg_match('/^[0-9]+$/', '1976')); // 返回真
var_dump(preg_match('/^9?$/', '99')); // 返回假
var_dump(preg_match('/^9{2}$/', '99')); // 返回真
var_dump(preg_match('/^[0-9]{2,}$/', '123')); //返回真
var_dump(preg_match('/^[0-9]{2,3}$/', '1234')); // 返回假,只能2~3位

下面匹配域名操作

$web = 'baidu.com';
var_dump(preg_match('/^[a-z-0-9-]+\.(com|net|com\.cn|org|cn)$/', $web));

下面是把 h1標簽內容加上超鏈接

$str = <<<html
<h1>hello pfinalClub</h1>
html;
echo preg_replace('/<h1>(.+)<\/h1>/', '<a , $str);

禁止重復匹配


正則表達式在進行重復匹配時,默認是貪婪匹配模式影斑,也就是說會盡量匹配更多內容给赞,但是有的時候我們并不希望他匹配更多內容,這時可以通過?進行修飾來禁止重復匹配矫户。

符號 說明
*? 重復任意次片迅,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次皆辽,但盡可能少重復
{n,m}? 重復n到m次柑蛇,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
$str = '123456';
preg_match('/\d+?/',$str,$matches);
print_r($matches);

因為增加了 ? 所以只匹配數(shù)字1
下面是使用禁止貪婪符替換將h1標簽內容傾斜處理

$str = "<h1>你好</h1><h1>PF南丞</h1>";
$preg = '/<h1>(.*?)<\/h1>/';
$replace = '<h1><em>\1</em></h1>';
echo preg_replace($preg,$replace,$str);

下面是替換h1-h6標簽內容驱闷,就不需要使用禁止貪婪符了

$str = "<h1>你好</h1><h2>PF南丞</h2>";
$preg = '/<h([1-6])>(.*)<\/h\1>/';
$replace = '<h\1><em>\2</em></h\1>';
echo preg_replace($preg,$replace,$str);

模式修正符


正則表達式在執(zhí)行時會按他們的默認執(zhí)行方式進行耻台,但有時候默認的處理方式總不能滿足我們的需求,所以可以使用模式修正符更改默認方式空另。

符號 說明
i 不區(qū)分大小寫字母的匹配
s 將字符串視為單行盆耽,換行符做普通字符看待,使“.” 匹 配任何字符
x 忽略空白及#符號扼菠,根據(jù)此特性可以添加正則注釋
m ^與$符匹配按行匹配
A 強制從字符串開始匹配(多行時默認以每行開始設置)
D 以$結尾時不允許后面有換行(使用\m時無效)

\i修正符不匹分大小示例

$str = 'https://www.pfinalClub.com PF南丞';
$preg = '/https:\/\/www.pfinalClub.com/i';
$replace= '<a href="\0">\0</a>';
echo preg_replace($preg,$replace,$str);

\s 將字符串示為單行操作

$preg = '#(<h1>)(.*?)(</h1>)#s';
preg_match_all($preg,$str,$matches);
//print_r($matches);

$replace = '\1<span style="color:red">\2\3';
echo preg_replace($preg,$replace,$str);

\m 使用 ^ 與 $ 按單行操作文本

$str = <<<php
#1 2022-02-12
PF南丞
@#100
雅虎網(wǎng)
#2 2033-09-11
PFinal
php;
$preg = '/^#\d+.*[\r|\n]$/m';
preg_match_all($preg, $str, $matches);
print_r($matches);

\x字符忽略空白和添加正則注釋
添加注釋

$str='pfinalClub.com';
$preg = '/^h
   # 這是匹配以 h 開始的內容
/x';
echo preg_replace($preg,'',$str);

當設置了\x后# 會被忽略摄杂,如果正則中使用#需要轉義處理

$str=<<<php
#1
PF南丞#1
#2
PFinal#2
php;
$preg = '/^
\#\d  #匹配以數(shù)字開始
+.* $ #后跟任何字符
/mx';
echo preg_replace($preg,'',$str);

\U 與?功能相似意為禁止貪婪匹配

$str = <<<php
<h1>PF南丞</h1>
<h1>PF南丞小哥</h1>
php;
$preg = '#<h1>.*</h1>#sU';
preg_match_all($preg,$str,$matches);
print_r($matches);

\A 與 ^限定符使用效果相似,必須以目標字符串開始循榆。下面是驗證郵箱例子

$str = 'lampxiezi@qq.com';
$preg = '/\w+@[\w\.]+/A';
preg_match_all($preg,$str,$matches);
print_r($matches);

\D 修正符使用不允許以換行結束

$str = <<<php
3a\n
php;
$preg = '/\d+a$/D';
preg_match_all($preg,$str,$matches);
print_r($matches);

常用函數(shù)


preg_match

獲取第一個匹配的內容

$str= '1@2@3';
preg_match('/\d+/',$str,$matches);
print_r($matches);

preg_match_all

獲取所有匹配的內容

$str= '1@2@3';
preg_match('/\d+/',$str,$matches);
print_r($matches);

preg_split

通過正則表達式拆分字符串

$str= '1@2#3';
$arr = preg_split('/@|#/',$str);
print_r($arr);

preg_replace

通過正則表達式替換

$str= '1@2#3';
echo preg_replace('/@|#/','-',$str);

preg_replace_callback

使用回調函數(shù)進行替換操作

$str = '1@2@3';
echo preg_replace_callback('/\d+/',function ($matches) {
return $matches[0]+100;
}, $str);
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末析恢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秧饮,更是在濱河造成了極大的恐慌映挂,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盗尸,死亡現(xiàn)場離奇詭異柑船,居然都是意外死亡,警方通過查閱死者的電腦和手機振劳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門椎组,熙熙樓的掌柜王于貴愁眉苦臉地迎上來油狂,“玉大人历恐,你說我怎么就攤上這事∽辏” “怎么了弱贼?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長磷蛹。 經(jīng)常有香客問我吮旅,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任庇勃,我火速辦了婚禮檬嘀,結果婚禮上,老公的妹妹穿的比我還像新娘责嚷。我一直安慰自己鸳兽,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布罕拂。 她就那樣靜靜地躺著揍异,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爆班。 梳的紋絲不亂的頭發(fā)上衷掷,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音柿菩,去河邊找鬼戚嗅。 笑死,一個胖子當著我的面吹牛枢舶,可吹牛的內容都是我干的渡处。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼祟辟,長吁一口氣:“原來是場噩夢啊……” “哼医瘫!你這毒婦竟也來了?” 一聲冷哼從身側響起旧困,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤醇份,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吼具,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僚纷,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年拗盒,在試婚紗的時候發(fā)現(xiàn)自己被綠了怖竭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡陡蝇,死狀恐怖痊臭,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情登夫,我是刑警寧澤广匙,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站恼策,受9級特大地震影響鸦致,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一分唾、第九天 我趴在偏房一處隱蔽的房頂上張望抗碰。 院中可真熱鬧,春花似錦绽乔、人聲如沸改含。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捍壤。三九已至,卻和暖如春鞍爱,著一層夾襖步出監(jiān)牢的瞬間鹃觉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工睹逃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盗扇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓沉填,卻偏偏與公主長得像疗隶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翼闹,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容

  • 正則表達式介紹 正則表達式簡介 正則表達式是用于描述字符排列和匹配模式的一種語法規(guī)則斑鼻。它主要用于字符串的模式分割、...
    dptms閱讀 10,935評論 1 9
  • 概述 正則表達式是一種描述字符串結果的語法規(guī)則猎荠,是一個特定的格式化模式坚弱,可以匹配、替換关摇、截取匹配的字符串荒叶。常用的語...
    醉于麥田閱讀 496評論 0 0
  • 正則表達式 php 正則表達式學習筆記 什么是正則表達式 正則表達式(Regular Expressions(Pe...
    Muxi_k閱讀 333評論 0 0
  • 本文譯自 制作正則引擎的作者 Jan Goyvaerts 為工具 RegexBuddy 寫的教程版權歸原作者所有注...
    極客圈閱讀 3,290評論 0 25
  • 正則表達式到底是什么東西?字符是計算機軟件處理文字時最基本的單位输虱,可能是字母些楣,數(shù)字,標點符號宪睹,空格愁茁,換行符,漢字等...
    獅子挽歌閱讀 2,148評論 0 9