您的位置:首页 - 教程 - 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) "-" } } 

评论: