程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php正則表達式基礎入門

php正則表達式基礎入門

編輯:PHP綜合

正則表達式,用於描述字符排列和匹配模式的一種語法規則。它主要用於字符串的模式分割、匹配、查找及替換操作。

PHP中的正則函數有兩套:
  一套是由PCRE(Perl Compatible Regular Expression)庫提供的。使用“preg_”為前綴命名的函數;
  一套由POSIX(Portable Operating System Interface of Unix )擴展提供的。使用以“ereg_”為前綴命名的函數;(POSIX的正則函數庫,自PHP 5.3以後,就不在推薦使用,從PHP6以後,就將被移除),不在本文之列。

PCRE全稱為Perl Compatible Regular Expression,意思是Perl兼容正則表達式。

PCRE正則表達式函數:

preg_match()
preg_match_all()
preg_quote()
preg_split()
preg_grep()
preg_replace()


在PCRE中,通常將模式表達式(即正則表達式)包含在兩個反斜線"/"之間,如"/apple/"。

正則中重要的幾個概念有:元字符、轉義、模式單元(重復)、反義、引用和斷言,這些概念都可以在文中輕松的理解和掌握。

常用的元字符(Meta-character):

元字符

 

'\'  :引用下一個元字符
'^ :行首
'.' : 除新行(newline)外的任一字符('/s'選項將使'.'匹配新行字符)
'$' :行尾(或結尾處新行之前字符)
'|' :可選項
'('與')' :分組
'['與']' :字符類。表示一類字符集合中任意一個,方括號內可使用'-'表示范圍,如[0-9]; 也可使用'^表示求補集,如[^0-9]表示除0-9外的其他字符

量詞(Quantifier)

'*' : 0或任意次
'+' : 1或更多次
'?' : 0或1次
{n} : n次
{n,} : 至少n次
{n, m} : n到m次

匹配方式
貪婪(greedy)方式:在模式其余部分匹配前提下,盡可能多地匹配字符
最少匹配(minimum): 盡可能少地匹配。量詞後使用'?'表示使用最少匹配方式
占有式:與貪婪方式相近,盡可能多地匹配字符,但絕不回退(backtrack,即使模式其余部分無法匹配,也不減少本部分的匹配數量)。在數量詞之後使用'+'表示使用占有式匹配。

轉義序列
'\t' : 制表符(HT, TAB)
'\n' : 換行(LF, NL)
'\r' : 回車(CR)
'\f' : 進紙(Form Feed, FF)
'\a' : 報警 (Alarm, BEL)
'\e' : 轉義(ESC)
"\0xx" : 八進制數值對應字符,如\033表示ESC
"\xhh" : 16進制數值對應字符,如\x1B表示ESC
"\x{hhhh}" : 16進制long型數值對應字符,如\x{263a}表示unicode SMILEY
"\cK" : K可以為任意字母,表示控制字符"control-K","\cK"表示如VT
"\N{name}" : unicode命名字符
"\N{U+hhhh}" : unicode字符
'\l' : 小寫下一字符
'\u' : 大寫下一字符
'\L' : 小寫隨後字符串直至'\E'
'\U' : 大寫隨後字符串直至'\E'
'\E' : 結束大小寫轉換
'\Q' : 引用隨後字符(禁止轉義)直至'\E'

字符類及其他轉義字符

'\A' :匹配字符串串首的原子
'\Z' : 字符串尾或尾部換行字符之前
'\z' : 字符串尾
'\b' :匹配單詞的邊界 /\bis/ 匹配頭為is的字符串 /is\b/ 匹配尾為is的字符串 /\bis\b/ 定界
'\B' :匹配除單詞邊界之外的任意字符 /\Bis/ 匹配單詞“This”中的“is”
'\G' : 在上一個匹配處進行匹配

'\w' : 匹任任一單詞(word)字符(26個英文字母、10個數字,加下劃線'_')
'\W' : 匹配任一非單詞字母
'\s' : 任一空白字符(空格' ', 制表符'\t'等)
'\S' : 任一非空白字符
'\d' : 任一數字字符[0-9]
'\D' : 任一非數字字符
“\pP” : 匹配命名屬性P
"\PP" : 匹配非P
'\X' : 匹配unicode擴展字符集(eXtended grapheme cluster)
'\C' : 匹配單個C字符(字節),即使工作在unicode模式下
'\n' : n為數字,後向引用指定組n
"\gn" : 後向引用指定組n
"\g{-n}" : 表示相對(當前位置之前的)第n個後用引用組n
"\g{name}" : 後向引用命名組(name)
"\k{name}" : 後向引用
'\K' : 使\K左側部分,不引入到$&中
'\N' : 除'\n'外的任一字符
'\v' : 垂直空白符
'\V' : 非垂直空白符
'\h' : 水平空白符
'\H' : 非水平空白符
'\R' : 行分割符號


模式修正符(Pattern Modifiers):
模式修正符在忽略大小寫、匹配多行中使用特別多,掌握了這一個修正符,往往能解決我們遇到的很多問題。
i    -可同時匹配大小寫字母
M   -將字符串視為多行
S   -將字符串視為單行,換行符做普通字符看待,使“.”匹配任何字符
X   -模式中的空白忽略不計
U   -匹配到最近的字符串
e   -將替換的字符串作為表達使用

示例:/apple/i  可匹配"apple"或"Apple"等,忽略大小寫。 /i  

$str = 'apple Apple';
$regex = '/apple/i';
if(preg_match_all($regex, $str, $arr)){
    var_dump($arr);
}
//輸出array(1) { [0]=> array(2) { [0]=> string(5) "apple" [1]=> string(5) "Apple" } }

PCRE的模式單元:

(\\1 提取第1位屬性)

/^\d{2}([\W])\d{2}\\1\d{4}$/ 匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字符串。但上述正則表達式不匹配“12/34-5678”的格式。這是因為模式“[\W]”的結果“/”已經被存儲。下個位置“\1”引用時,其匹配模式也是字符“/”。
當不需要存儲匹配結果時使用非存儲模式單元"(?:)"

$str = '12-31-2006';
$regex = '/^\d{2}([\W])\d{2}\\1\d{4}$/';
if(preg_match_all($regex, $str, $arr)){
    var_dump($arr);
}
//輸出array(2) { [0]=> array(1) { [0]=> string(10) "12-31-2006" } [1]=> array(1) { [0]=> string(1) "-" } } 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved