PHP學習之-Regex

來源:互聯網
上載者:User

標籤:

PHP學習之-Regex1、什麼是Regex

Regex是對字串處理額一種邏輯公式,就是用特定的字串組合成一個規則的字串,稱之為正則匹配模式

$p = ‘/apple/‘;$str = ‘‘apple banna‘;if (preg_match($p,$str)) {  echo ‘matched‘;  }

其中字串 ‘/apple/‘ 就是一個Regex,用來匹配字串中是否存在apple字串。

PHP中使用PCRE庫函數進行正則匹配,比如上例中的preg_match用於執行一個正則匹配,常用來判斷一類字元模式是否存在。

 

2、Regex的基本文法

PCRE庫函數中,正則匹配模式使用分隔字元與元字串組成,分隔字元可以使非數字、反斜線、空格的任一字元。經常使用的分隔字元是正斜線(/)、hash符號(#)以及取反符號(~),例如

/foo bar/#^[^0-9]$#~PHP~

如果正則表單時中包含分隔字元,則分隔字元需要使用反斜線(\)進行轉義。

/http:\/\//

如果模式中包含較多的分隔字元,建議跟換其他的字元作為分隔字元,也可以使用preg_quote進行轉義。

$p = ‘http://‘;$p = ‘/‘.preg_quote($p,‘/‘).‘/‘;echo $p;

分隔字元後面可以使用模式修飾符,模式修飾符包括:i,m,s,x等,例如使用修飾符可以忽略大小寫

$str = ‘http://www.baidu.com‘;if (preg_match(‘/http/i‘,$str)) {  echo ‘匹配成功‘;  }

3、元字元與轉義

Regex具有特殊含義的字元成為元字元,常用的字元有:

\ 一般逸出字元

^ 斷言磨邊的開始位置(或在多行模式下是行首)

$ 斷言牧鞭的結束位置(或在多行下是行尾)

. 匹配除分行符號外的任何字元(預設)

[ 開始字元類定義

] 結束字元類定義

( 子組的開始標記

) 子組的結束標記

? 作為量詞,表示0次或者1次匹配,位於兩次後面用於改變數的詞貪婪特性(查閱量詞)

* 量詞,0次或者多次匹配。

+ 量詞,1次或者多次匹配

} 自訂量詞的開始

{ 自訂量詞的結束

// 下邊的\s表示任意的空白符,包括空格,定位字元,分行符號。[^\s] 代表非空白符。[^\s]+表示一次或者多次匹配非空格符。$p = ‘/^ 我[^\s]+(蘋果|香蕉)$/‘;$str = "我喜歡吃蘋果";if (preg_match($p,$str)) {  echo ‘匹配成功‘;  }

元字元具有兩種使用情境,一種是可以在任何地方都可能使用,另一種是只能在方括弧中使用,在方括弧中只用的有:

\ 逸出字元

^ 只是作為第一個字元(方括弧內),表示字元取反

- 標記字元範圍

其中^ 在反括弧外面,表示斷言目標的開始位置,但是在方括弧的內部表示匹配字元類取反,方括弧內的減號-可以標記字元範圍,例如:0-9表示0到9自檢的所有數字。

// 下面的 \w匹配字母或數字或底線$p = ‘/[\w\.\-][email protected][a-z0-9\-]+\.(com|cn)/‘;$str = "我的郵箱是 [email protected]";preg_match($p,$str,$match);echo $match;

 

4、貪婪模式和懶惰模式

Regex中每個元字元匹配一個字元,當使用+自後會變得貪婪,它將匹配儘可能多的字元,但使用問號?字元時,它將竟可能少的匹配字元,即使懶惰模式。

貪婪模式:在可以匹配與不匹配的時候,優先匹配

// 下面的\d代表匹配數字$p = ‘/\d+\-\d+/‘;$str = ‘我的電話是101-12345678‘;preg_match($p,$str,$match);echo $match[0]; // 結果101-12345678

懶惰模式:在可匹配和不可匹配的時候,優先不匹配

// 下面的\d代表匹配數字$p = ‘/\d+\-\d+/‘;$str = ‘我的電話是101-12345678‘;preg_match($p,$str,$match);echo $match[0]; // 結果0-1

當我們確切的知道所匹配的字元長度的時候可以使用{}自定匹配字元數

// 下面的\d代表匹配數字$p = ‘/\d{3}\-\d{8}/‘;$str = ‘我的電話是101-12345678‘;preg_match($p,$str,$match);echo $match[0]; // 結果0-1

5、使用Regex進行匹配

6、尋找所有匹配結果

7、增長表單時的搜尋和替換

8、正則匹配常用案例

正則匹配常用在表單驗證上,一些欄位會有一定的格式要求,比如使用者名稱一般都要求必須是字母、數字或底線組成,郵箱、電話等也都有自己的規則,因此使用Regex可以很好的對這些欄位進行驗證。我們通過案例來看一下一般的使用者註冊頁,都怎樣對欄位進行驗證。

<?php$user = array(    ‘name‘ => ‘spark1985‘,    ‘email‘ => ‘[email protected]‘,    ‘mobile‘ => ‘13312345678‘);//進行一般性驗證if (empty($user)) {    die(‘使用者資訊不可為空‘);}if (strlen($user[‘name‘]) < 6) {    die(‘使用者名稱長度最少為6位‘);}//使用者名稱必須為字母、數字與底線if (!preg_match(‘/^\w+$/i‘, $user[‘name‘])) {    die(‘使用者名稱不合法‘);}//驗證郵箱格式是否正確if (!preg_match(‘/^[\w\.][email protected]\w+\.\w+$/i‘, $user[‘email‘])) {    die(‘郵箱不合法‘);}//手機號必須為11位元字,且為1開頭if (!preg_match(‘/^1\d{10}$/i‘, $user[‘mobile‘])) {    die(‘手機號不合法‘);}echo ‘使用者資訊驗證成功‘;

 

PHP學習之-Regex

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.