正則表達式
正則表達式被用來檢索或替換那些符合某個模式的文本內容。許多程序設計語言都支持利用正則表達式進行字符串操作煎殷。例如: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);