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) "-" } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。