正則表示式 學習整理
正則表示式
什麼叫正則表示式
正則表示式是對字串進行操作的一種邏輯公式,就是用一些特定的字元組合成一個規則字串,稱之為正則匹配模式。
$p = '/apple/';
$str = "apple banna";
if (preg_match($p, $str,$array)) {
echo 'matched';
}
其中字串'/apple/'就是一個正則表示式,他用來匹配源字串中是否存在apple字串。
PHP中使用PCRE庫函式進行正則匹配,比如上例中的preg_match用於執行一個正則匹配,常用來判斷一類字元模式是否存在。
正則表示式的基本語法
PCRE庫函式中,正則匹配模式使用分隔符與元字元組成,分隔符可以是非數字、非反斜線、非空格的任意字元。經常使用的分隔符是正斜線(/)、hash符號(#) 以及取反符號(~),例如:
/foo bar/
#^[^0-9]$#
~php~
如果模式中包含分隔符,則分隔符需要使用反斜槓(\)進行轉義。
/http:\/\//
如果模式中包含較多的分割字元,建議更換其他的字元作為分隔符,也可以採用preg_quote進行轉義。
$p = 'http://';
$p = '/'.preg_quote($p, '/').'/';
echo $p;
分隔符後面可以使用模式修飾符,模式修飾符包括:i, m, s, x等,例如使用i修飾符可以忽略大小寫匹配:
$str = "Http://www.imooc.com/";
if (preg_match('/http/i', $str)) {
echo '匹配成功';
}
元字元與轉義
正則表示式中具有特殊含義的字元稱之為元字元,常用的元字元有:
\ 一般用於轉義字元
^ 斷言目標的開始位置(或在多行模式下是行首)
$ 斷言目標的結束位置(或在多行模式下是行尾)
. 匹配除換行符外的任何字元(預設)
[ 開始字元類定義
] 結束字元類定義
| 開始一個可選分支
( 子組的開始標記
) 子組的結束標記
? 作為量詞,表示 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[0];
貪婪模式與懶惰模式
正則表示式中每個元字元匹配一個字元,當使用+之後將會變的貪婪,它將匹配儘可能多的字元,但使用問號?字元時,它將盡可能少的匹配字元,既是懶惰模式。
貪婪模式:在可匹配與可不匹配的時候,優先匹配
//下面的\d表示匹配數字
$p = '/\d+\-\d+/';
$str = "我的電話是010-12345678";
preg_match(,$p $str, $match);
echo $match[0]; //結果為:010-12345678
懶惰模式:在可匹配與可不匹配的時候,優先不匹配
$p = '/\d?\-\d?/';
$str = "我的電話是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //結果為:0-1
當我們確切的知道所匹配的字元長度的時候,可以使用{}指定匹配字元數
$p = '/\d{3}\-\d{8}/';
$str = "我的電話是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //結果為:010-12345678
使用貪婪模式匹配字串中的姓名。(提示:\w匹配字母或數字或下劃線,\s匹配任意的空白符,包括空格、製表符、換行符)
$p = '/name:([\w\s]+)/';
$str = "name:steven jobs";
preg_match($p, $str, $match);
echo $match[1]; //結果為:steven jobs
使用正則表示式進行匹配
使用正則表示式的目的是為了實現比字串處理函式更加靈活的處理方式,因此跟字串處理函式一樣,其主要用來判斷子字串是否存在、字串替換、分割字串、獲取模式子串等。
PHP使用PCRE庫函式來進行正則處理,通過設定好模式,然後呼叫相關的處理函式來取得匹配結果。
preg_match用來執行一個匹配,可以簡單的用來判斷模式是否匹配成功,或者取得一個匹配結果,他的返回值是匹配成功的次數0或者1,在匹配到1次以後就會停止搜尋。
$subject = "abcdef";
$pattern = '/def/';
preg_match($pattern, $subject, $matches);
print_r($matches); //結果為:Array ( [0] => def )
上面的程式碼簡單的執行了一個匹配,簡單的判斷def是否能匹配成功,但是正則表示式的強大的地方是進行模式匹配,因此更多的時候,會使用模式:
$subject = "abcdef";
$pattern = '/a(.*?)d/';
preg_match($pattern, $subject, $matches);
print_r($matches); //結果為:Array ( [0] => abcd [1] => bc )
通過正則表示式可以匹配一個模式,得到更多的有用的資料。
例:編寫程式碼使用preg_match匹配字串中的郵箱,並輸出該郵箱。
$subject = "my email is [email protected]";
$pattern = '/[\w\-][email protected]\w+\.\w+/';
preg_match($pattern, $subject, $matches);
echo $matches[0];
查詢所有匹配結果
preg_match只能匹配一次結果,但很多時候我們需要匹配所有的結果,preg_match_all可以迴圈獲取一個列表的匹配結果陣列。
$p = "|<[^>]+>(.*?)</[^>]+>|i";
$str = "<b>example: </b><div align=left>this is a test</div>";
preg_match_all($p, $str, $matches);
print_r($matches);
可以使用preg_match_all匹配一個表格中的資料:
$p = "/<tr><td>(.*?)<\/td>\s*<td>(.*?)<\/td>\s*<\/tr>/i";
$str = "<table> <tr><td>Alex</td><td>25</td></tr> <tr><td>John</td><td>26</td></tr> </table>";
preg_match_all($p, $str, $matches);
print_r($matches);
$matches結果排序為$matches[0]儲存完整模式的所有匹配, $matches[1] 儲存第一個子組的所有匹配,以此類推。
例:使用preg_match_all匹配所有li標籤中的資料。
<?php
$str = "<ul>
<li>item 1</li>
<li>item 2</li>
</ul>";
//實現正則匹配所有li中的資料
$p = "/<li>(.*)<\/li>/i";//解釋下這個正則://後面的i表示不區分大小寫,<li>(.*?)<\/li>表示li標籤內的匹配的()內的值有多少,括號內的.表示所有單字元,*表示數量為0個或者多個。也就是li標籤內有字元就顯示出來
preg_match_all($p, $str, $matches);
print_r($matches[1]);
正則表示式的搜尋和替換
正則表示式的搜尋與替換在某些方面具有重要用途,比如調整目標字串的格式,改變目標字串中匹配字串的順序等。
例如我們可以簡單的調整字串的日期格式:
$string = 'April 15, 2014';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '$3, ${1} $2';
echo preg_replace($pattern, $replacement, $string); //結果為:2014, April 15
其中${1}與$1的寫法是等效的,表示第一個匹配的字串,$2代表第二個匹配的。
通過複雜的模式,我們可以更加精確的替換目標字串的內容。
$$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');//\3等效於$3,\4等效於$4,依次類推
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27'); //結果為:$startDate = 5/27/1999
//詳細解釋下結果:(19|20)表示取19或者20中任意一個數字,(\d{2})表示兩個數字,(\d{1,2})表示1個或2個數字,(\d{1,2})表示1個或2個數字。^\s*{(\w+)\s*=}表示以任意空格開頭的,並且包含在{}中的字元,並且以任意空格結尾的,最後有個=號的。
用正則替換來去掉多餘的空格與字元:
$$str = 'one two';
$str = preg_replace('/\s+/', ' ', $str);
echo $str; // 結果改變為'one two'
例:將目標字串$str中的檔名替換後增加em標籤,例如index.php要替換成<em>index.php</em>。
$str = '主要有以下幾個檔案:index.php, style.css, common.js';
//將目標字串$str中的檔名替換後增加em標
$p = '/\w+\.\w+/i';
$str = preg_replace($p, '<em>$0</em>', $str);
echo $str;
正則匹配常用案例
正則匹配常用在表單驗證上,一些欄位會有一定的格式要求,比如使用者名稱一般都要求必須是字母、數字或下劃線組成,郵箱、電話等也都有自己的規則,因此使用正則表示式可以很好的對這些欄位進行驗證。
我們通過案例來看一下一般的使用者註冊頁,都怎樣對欄位進行驗證。
<?php
$user = array(
'name' => 'marchalex',
'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 '使用者資訊驗證成功';
相關推薦
正則表示式 學習整理
正則表示式 什麼叫正則表示式 正則表示式是對字串進行操作的一種邏輯公式,就是用一些特定的字元組合成一個規則字串,稱之為正則匹配模式。 $p = '/apple/'; $str = "apple banna"; if (preg_match($p, $str,$arr
正則表示式學習使用筆記整理
正則表示式一般來說分為正向正則表示式和逆向正則表示式 正則表示式可以實現字串匹配的功能,它採用一定的策略進行匹配,在有貪婪模式的情況下,正則會優先匹配能匹配的最大值,然後再以步退的模式向前迭代,直到整句正則表示式完全匹配為止,可以看出,在有貪婪模式的正則中,時間
java正則表示式學習筆記
本人在開發中使用正則表達的場景並不多,偶爾用一下,學習一波,時間久了就又忘記了,放到部落格中,說不定什麼時候就用到了。 一.正則表示式的語法 這個語法表來自:http://www.runoob.com/java/java-regular-expressions.html
正則表示式學習——網址匹配
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 已上鍊接學習大全。 練習:請嘗試寫一個驗證Email地址的正則表示式。 【版本一】應該可以驗證出類似的Email: [email protected] [em
正則表示式[] {} ()學習
正則表示式的() [] {}有不同的意思。 () 是為了提取匹配的字串。表示式中有幾個()就有幾個相應的匹配字串。 (\s*)表示連續空格的字串。 []是定義匹配的字元範圍。比如 [a-zA-Z0-9] 表示相應位置的字元要匹配英文字元和數字。[\s*]表示空格或者*號。 {
Python3 正則表示式語法整理
^ : 匹配輸入字串的開始位置(或在多行模式下行的開頭,即緊隨一換行符之後) . : 匹配除了換行符 \n 外的任意一個字元 : 匹配0次、1次或多次其前的原子 $ : 匹配輸入字串的結束位置(或在多行模式下
python正則表示式學習筆記
正則表示式 學習資源:https://github.com/EbookFoundation/free-programming-books/blob/master/free-programming-books-zh.md 正則表達例子: | A|B 
以Grep學正則表示式 學習筆記
基本格式 grep -n -A2 -B3 --color=auto 'the' ./ 搜尋特定字串 grep -n 'the' //含 grep -vn 'the' //不含 grep -in 'the' //含大小寫 利用中括號 [] 來搜尋集合字元 grep -n
正則表示式知識整理
注:本文所有的例子都來自於《正則表示式必知必會(修訂版)》。 正則表示式的作用是用來檢索文字或替換文字。如: (絕大多數正則表示式引擎的預設行為是返回第1個匹配結果。) 正則表示式中一個非常重要的概念就是元字元,你可以不用去理什麼限定符、定位符之類,只要記住它們都是元
字元?正則?bugku(正則表示式學習)
題目 通過讀程式碼可以看出只要我們構造出符合正則表示式的字串通過GET傳參傳過去就可以看到 key 即 flag 通過這道題看了很多正則表示式的語法規則…… ------------------------------------------------------------
Java正則表示式學習與記錄
轉載自:http://www.runoob.com/java/java-regular-expressions.html 正則表示式定義了字串的模式,用於搜尋、編輯或處理文字。 1、正則表示式中字元意義: \ 將下一字元標
python 正則表示式學習
re.match()函式: 函式語法: re.mathch ( pattern , string , flags = 0) 引數說明: pattem 匹配的正則表示式
正則表示式學習筆記(一)
開始和結束 ^ $ '^' 表示開始 例如:'^the' 表示以 the 開頭的詞 '$' 表示結束 例如:'the$' 表示以 the 結尾的詞 'the' 表示 包含 the 的詞
正則表示式學習
正則表示式 就是為了查詢到制定的字串。 學習它沒有那麼難的,最簡單的表達方式就是 {在哪裡} {什麼字元} {匹配多少次} 一、定位符(在哪裡) 字元 描述 ^ 匹
最全的正則表示式學習使用大全
[原創文章,轉載請保留或註明出處:http://www.regexlab.com/zh/regref.htm] 引言 正則表示式(regular expression)就是用一個“字串”來描述一個特徵,然後去驗證另一個“字串”是否符合這個特徵。比如 表示
正則表示式語法整理
^ : 匹配輸入字串的開始位置(或在多行模式下行的開頭,即緊隨一換行符之後) . : 匹配除了換行符 \n 外的任意一個字元 : 匹配0次、1次或多次其前的原子 $ :
在linux下,如何在C語言中使用正則表示式(整理)
一個正則表示式的教程可以參看(裡面有個測試正則表示式的工具) 正則表達是用來匹配字串的好東東。 如果使用者熟悉Linux下的sed、awk、grep或vi,那麼對正則表示式這一概念肯定不會陌生。由於它可以極大地簡化處理字串時的複雜度,因此現 在已
js正則表示式學習之
正則表示式 - 語法 正則表示式(regular expression)描述了一種字串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個
搞定PHP面試 - 正則表示式知識點整理
一、簡介 1. 什麼是正則表示式 正則表示式(Regular Expression)就是用某種模式去匹配一類字串的一種公式。正則表示式使用單個字串來描述、匹配一系列匹配某個句法規則的字串。正則表示式是繁瑣的,但它是強大的,學會之後的應用會讓你除了提高效率外,會給你帶來絕對的成就感。只要認真閱讀本教程,加上
jmeter 正則表示式學習(一)--使用詳解
jmeter自帶後置處理器:正則表示式提取器,可以用來提取介面響應裡的資訊,給予後續介面傳參用。 例如要提取響應結果裡的token欄位及sex欄位(響應內容為: "token":"83EEAA887F1D2F1AA1CDA9E197810992","sex":0