[TOC]
正則表達式(Regular Expression,在代碼中常簡寫為regex、regexp或RE)是計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。 在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
簡單來說正則表達式就是完成字符串的增、刪、改、查
## 應用場合
數據驗證、文本替換、內容檢索、過濾內容
可以理解為:執行字符串函數無法完成的特殊的匹配、拆分、 替換功能
## 定界符
正則表達式語句需要由分隔符(定界符)閉合包裹,分隔符可以使任意非 字母數字, 非反斜線, 非空白字符
經常使用的分隔符是正斜線(/), hash符號(#) 以及取反符號(~)。
建議使用//做為定界符,因為和js一致
實例
~~~
<?php
$preg= "/xuebingsi/";
$c = preg_match($preg,"學并思網址xuebingsi.com");
echo $c;
?>
~~~
## 原子(元字符)
原子是正則表達式中的最小的元素,包括英文、標點符號等
### 原子構成方式
普通字符是編寫正則表達式時最常見的原子了,包括所有的大寫和小寫字母字符、所有數字等
一些特殊字符和元字符作為原子,統統使用`"\"`轉義字符進行轉義即可。
在正則表達式中可以直接使用一些系統提供的代表范圍的原子,如下面的表格所示:
<table class="jbborder">
<tbody>
<tr>
<td>
代表范圍的原子
</td>
<td>
說明
</td>
<td>
自定義原子表示法
</td>
</tr>
<tr>
<td>
\d
</td>
<td>
表示任意一個十進制的數字
</td>
<td>
[0-9]
</td>
</tr>
<tr>
<td>
\D
</td>
<td>
表示任意一個除數字這外的字符
</td>
<td>
[^0-9]
</td>
</tr>
<tr>
<td>
\s
</td>
<td>
表示任意一個空白字符,空格、\n\r\t\f
</td>
<td>
[\n\r\t\f ]
</td>
</tr>
<tr>
<td>
\S
</td>
<td>
表示任意一個非空白
</td>
<td>
[^\n\r\t\f ]
</td>
</tr>
<tr>
<td>
\w
</td>
<td>
表示任意一個字 a-zA-Z0-9_
</td>
<td>
[a-zA-Z0-9_]
</td>
</tr>
<tr>
<td>
\W
</td>
<td>
表示任意一個非字,除了a-zA-Z0-9_以外的任意一個字符
</td>
<td>
[^a-zA-Z0-9_]
</td>
</tr>
</tbody>
</table>
### 自定義原子表([])作為原子
在一組字符中匹配某個元字符,在正則表達式中通過元字符表來完成,就 是放到[..](方括號)中
<table class="dataintable">
<tbody><tr>
<th style="width:20%">表達式</th>
<th>描述</th>
</tr>
<tr>
<td><a>[abc]</a></td>
<td>查找方括號之間的任何字符。</td>
</tr>
<tr>
<td><a>[^abc]</a></td>
<td>查找任何不在方括號之間的字符。</td>
</tr>
<tr>
<td>[0-9]</td>
<td>查找任何從 0 至 9 的數字。</td>
</tr>
<tr>
<td>[a-z]</td>
<td>查找任何從小寫 a 到小寫 z 的字符。</td>
</tr>
<tr>
<td>[A-Z]</td>
<td>查找任何從大寫 A 到大寫 Z 的字符。</td>
</tr>
<tr>
<td>[A-z]</td>
<td>查找任何從大寫 A 到小寫 z 的字符。</td>
</tr>
<tr>
<td>[adgk]</td>
<td>查找給定集合內的任何字符。</td>
</tr>
<tr>
<td>[^adgk]</td>
<td>查找給定集合外的任何字符。</td>
</tr>
<tr>
<td>(red|blue|green)</td>
<td>查找任何指定的選項。</td>
</tr>
<tr>
<td>.</td>
<td>點在正則中表示除換行符外的任意字符</td>
</tr>
</tbody></table>
**實例**
~~~
<?php
$str ="1.jpg@2.jpg@3.jpg#4.jpg";
$preg="/[@#]/";
$c = preg_match($preg,$str);
var_dump($c);
?>
~~~
## 原子組(元字符組)
>[success]如果一次要匹配多個元子,可以通過元子組完成
原子組不原子表的差別在于原子組一次匹配多個元子,而原子表則 是匹配成功表中的一個元字符就可以
元字符組用()表示
組號是從 左到右計數的調用時: 這種方式我們叫做反向引用
**實例**
~~~
<?php
$str = "學并思官網www.xuebingsiwang.com學并思論壇 http://bbs.xuebingsiwang.com我在學并思的網名叫xuebingsi";
$preg = "/(xuebingsi)wang/is";
$newStr= preg_replace($preg,"<span style='color:#f00'>$1</span>wang",$str);
echo $newStr;
?>
~~~
## 選擇修釋符
>[success]| 這個符號帶表選擇修釋符,也就是 | 左右兩側有一個匹配到就可以
實例
~~~
<?php
$str = "http://www.baidu.com不新浪網http://www.sina.com";
$preg = "/\.(baidu|sina)\./";
$new_str = preg_replace($preg,'.xuebingsiwang.',$str);
?>
~~~
## 重復匹配(量詞)
>[success]如果要重復匹配一些內容時我們要使用重復匹配修飾符,包括以下幾種
<table class="dataintable">
<tbody>
<tr>
<th style="width:20%">
量詞
</th>
<th>
描述
</th>
</tr>
<tr>
<td>
<a>
*
</a>
</td>
<td>
重復零次或更多次
</td>
</tr>
<tr>
<td>
<a>
+
</a>
</td>
<td>
重復一次或更多次
</td>
</tr>
<tr>
<td>
<a>
?
</a>
</td>
<td>
重復零次或一次
</td>
</tr>
<tr>
<td>
<a>
{n}
</a>
</td>
<td>
重復n次
</td>
</tr>
<tr>
<td>
<a>
{n,}
</a>
</td>
<td>
重復n次或更多次
</td>
</tr>
<tr>
<td>
<a>
{n,m}
</a>
</td>
<td>
重復n到m次
</td>
</tr>
</tbody>
</table>
因為正則最小單位是元字符,而我們很少只匹配一個元字符如a、b所以基 本上重復匹配在每條正則語句中都是必用到的內容
## 禁止重復匹配
>[success]正則表達式在進行重復匹配時,默認是貪婪匹配模式,也就是說會盡量匹配更多內容,但是有的時候我們并不希望他匹配更多內容,這時可以通過? 進行修飾來禁止重復匹配
<table class="dataintable">
<tbody>
<tr>
<th style="width:20%">
量詞
</th>
<th>
描述
</th>
</tr>
<tr>
<td>
<a>
*?
</a>
</td>
<td>
重復零次或更多次,但盡可能少重復
</td>
</tr>
<tr>
<td>
<a>
+?
</a>
</td>
<td>
重復一次或更多次,但盡可能少重復
</td>
</tr>
<tr>
<td>
<a>
??
</a>
</td>
<td>
重復零次或一次,但盡可能少重復
</td>
</tr>
<tr>
<td>
<a>
{n}?
</a>
</td>
<td>
重復n次,但盡可能少重復
</td>
</tr>
<tr>
<td>
<a>
{n,}?
</a>
</td>
<td>
重復n次或更多次,但盡可能少重復
</td>
</tr>
<tr>
<td>
<a>
{n,m}?
</a>
</td>
<td>
重復n到m次,但盡可能少重復
</td>
</tr>
</tbody>
</table>
## 匹配字符邊界
>[success]如果想匹配字符的邊界,邊界包括空格、標點符號、換行等,可以使用正則表達式的匹配字符邊界修飾符如下
1. ^匹配字符串的開始
2. $匹配字符串的結束,忽略換行符\n
## 模式修正符
>[success]正則表達式在執行時會按他們的默認執行方式進行,但有時候默認的處理方式總不能滿足我們的需求,所以可以使用模式修正符更改默認方式。
1. i不區分大小寫字母的匹配
2. s將字符串視為單行,換行符做普通字符看待,使“.” 匹配任何字符
3. 常用正則操作函數
## preg_match()方法
>[success]執行一個正則表達式匹配
**語法:**
`int preg_match ($pattern , $subject) `
## preg_match_all()方法
>[success]執行一個全局正則表達式匹配
**語法:**
`int preg_match_all ($pattern ,$subject [, array &$matches])`
matches多維數組,作為輸出參數輸出所有匹配結果, 數組排序通過flags指定。
## preg_split()方法
>[success]通過一個正則表達式分隔字符串
**語法:**
`array preg_split ( string $pattern , string $subject)`
## preg_replace()方法
>[success]執行一個正則表達式的搜索和替換
**語法:**
`mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject)`
>[danger] 練習:搞懂郵箱,手機,身份證,網址等等正則,采集拉勾網招聘職位數據
- 序言
- 第一章:準備工作
- 寫在學習之前的話
- web應用開發結構
- 開發工具/環境
- 第二章:展現層面(HTML/CSS)
- HTML簡介
- HTML基礎
- HTML編碼
- HTML鏈接
- HTML圖像
- HTML列表
- HTML表單
- HTML表格(分水嶺)
- HTML 實體
- HTML框架
- CSS層疊樣式表
- CSS選擇器
- CSS文本/字體
- CSS繼承和疊加
- CSS框模型
- CSS浮動(分水嶺)
- CSS定位
- CSS背景
- CSS圖標字體
- CSS補充
- 開發技巧
- 第三章:展現層面(Javascript)
- JS簡介
- JS實現
- JS輸出交互
- JS變量
- JS數據類型
- JS運算符
- JS流程控制(分水嶺)
- JS函數
- JS數組
- JS對象(分水嶺)
- JS數組對象
- JS字符串對象
- JS數學對象
- JS日期對象
- JS BOM對象(分水嶺)
- JS DOM對象
- JS事件對象
- JS元素對象
- JS DOM節點
- 第四章:展現層面(Jquery)
- JQ簡介
- JQ使用
- JQ選擇器
- JQ篩選
- JQ屬性
- JQ-CSS
- JQ事件
- JQ文檔處理
- JQ效果
- JQ-ajax
- 第五章:邏輯/業務層面(PHP)
- PHP簡介
- PHP變量
- PHP數據類型
- PHP常量
- PHP運算符
- PHP流程控制
- PHP函數(分水嶺)
- PHP日期
- PHP數學
- PHP數組
- PHP字符串
- PHP正則表達式(分水嶺)
- PHP目錄操作
- PHP文件
- PHP上傳/下載
- PHP面向對象(分水嶺)
- PHP圖像處理
- PHP會話控制
- Ajax異步處理
- PHPMysql擴展
- PHPMysqli擴展
- PHPPdo擴展
- PHP接口
- PHP命名空間
- 第六章:邏輯/業務層面(框架設計)
- 第七章:存儲層面(mysql)
- Mysql基礎
- Mysql Sql簡介
- Mysql數據庫
- Mysql數據類型
- Mysql數據表
- Mysql操作記錄
- Mysql查詢
- Mysql修改表結構
- Mysql日期與時間
- Mysql分組統計
- Mysql多表查詢
- Mysql安全
- Mysql存儲引擎
- Mysql事務
- Mysql視圖
- Mysql觸發器
- Mysql存儲過程
- Mysql存儲函數
- Mysql優化
- 第八章:服務器(Linux)
- Linux介紹與安裝
- Shell
- 目錄與文件操作
- VIM編輯器使用
- 帳號管理
- SUDO
- 權限控制
- 壓縮與打包
- 軟件安裝
- 計劃任務
- 進程管理
- 寶塔Linux面板