正则笔记
1.定界符
定界符号,多种都可以,常用//
2.原子(所有的打印字符和所有的非打印字符)
最小的一个匹配单位(放在定界符中),在一个正则表达式中,至少有一个原子
2.1普通的字符作为原子:如a~z、A~Z、0~9等
2.2一些特殊字符和转义后的元字符作为原子:\" \' \+ \? \.等
2.3一些非打印字符作为原子:\f \n \r \t \cX 等
2.4通用字符类型:\d \D \w \W \s \S 等
. 换行符以外的所有字符
\d 任意十进制数字
\D 任意非十进制数字
\h 任意水平空白字符(since PHP 5.2.4)
\H 任意非水平空白字符(since PHP 5.2.4)
\s 任意空白字符
\S 任意非空白字符
\v 任意垂直空白字符(since PHP 5.2.4)
\V 任意非垂直空白字符(since PHP 5.2.4)
\w 任意单词字符(匹配字母或数字或下划线或汉字)
\W 任意非单词字符
\b 单词边界(匹配单词的开始或结束)
\B 非单词边界
\A 目标的开始位置(独立于多行模式)
\Z 目标的结束位置或结束处的换行符(独立于多行模式)
\z 目标的结束位置(独立于多行模式)
\G 在目标中首次匹配位置
2.5自定义原子表([])作为原子 :'/[api]sp/' '/^[jkl]sp/'
2.6.1转义字符(\):可以将有意义的字符转换成没有意义的原子字符
2.6.2转义字符(\):可以将没有意义的字符转换成有意义的字符
3.元字符(限定符)
元字符不能单独使用,修饰原子,是用来扩展原子功能和限定功能(写在定界符号中)
^匹配字符串的开始
$匹配字符串的结束
*重复零次或更多次(任意次)
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
3.1 贪婪与非贪婪
3.1.1 贪婪模式:尽可能多地匹配文字
元字符中 '*'、 '+' 或 '?' 默认为贪婪模式
例如:
$str = "<H1>Chapter 1 – Introduction to Regular Expressions</H1>"; $zz = "/<.*>/"; preg_match_all($zz, $str, $arr); var_dump($arr);
结果:array (size=1)
0 =>
array (size=1)
0 => string '<H1>Chapter 1 – Introduction to Regular Expressions</H1>'
3.1.2 非贪婪模式:尽可能少地匹配文字
通过在 '*'、 '+' 或 '?' 限定符后放置 '?',该表达式就从贪婪匹配转为了非贪婪或最小匹配。
例如:
$str = "<H1>Chapter 1 – Introduction to Regular Expressions</H1>"; $zz = "/<.*?>/"; preg_match_all($zz, $str, $arr); var_dump($arr);
结果:array (size=1)
0 =>
array (size=2)
0 => string '<H1>' (length=4)
1 => string '</H1>' (length=5)
4.模式修正符
修正,对模式(正则)修正,(写在定界符外面,写在右边)
i (PCRE_CASELESS):不区分大小写的匹配;
如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。
m (PCRE_MULTILINE):将字符串视为多行,不管是那行都能匹配;
默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。如果目标字符串 中没有 "\n" 字符,或者模式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响。
s (PCRE_DOTALL):将字符串视为单行,换行符作为普通字符;
如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个修饰符,点号不匹配换行符。
一个取反字符类比如 [^a] 总是匹配换行符,而不依赖于这个修饰符的设置。
x (PCRE_EXTENDED):将模式中的空白忽略;
如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。 这个修饰符 等同于 perl 中的 /x 修饰符,使被编译模式中可以包含注释。 注意:这仅用于数据字符。 空白字符还是不能在模式的特殊字符序列中出现,比如序列 (?( 引入了一个条件子组(译注: 这种语法定义的特殊字符序列中如果出现空白字符会导致编译错误。 比如(?(就会导致错误)。
A (PCRE_ANCHORED):强制从目标字符串开头匹配;
如果设置了这个修饰符,模式被强制为"锚定"模式,也就是说约束匹配使其仅从目标字符串的开始位置搜索。这个效果同样可以使用适当的模式构造出来,并且 这也是 perl 种实现这种模式的唯一途径。
D (PCRE_DOLLAR_ENDONLY):如果使用$限制结尾字符,则不允许结尾有换行;
如果这个修饰符被设置,模式中的元字符美元符号仅仅匹配目标字符串的末尾。如果这个修饰符没有设置,当字符串以一个换行符结尾时, 美元符号还会匹配该换行符(但不会匹配之前的任何换行符)。 如果设置了修饰符m,这个修饰符被忽略. 在 perl 中没有与此修饰符等同的修饰符。
S
当一个模式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间对其进行一些额外的分析。如果设置了这个修饰符,这个额外的分析就会执行。当前,这种对一个模式的分析仅仅适用于非锚定模式的匹配(没有单独的固定开始字符)。
U (PCRE_UNGREEDY):只匹配最近的一个字符串;不重复匹配;
这个修饰符逆转了量词的"贪婪"模式。 使量词默认为非贪婪的,通过量词后紧跟? 的方式可以使其成为贪婪的。这和 perl 是不兼容的。 它同样可以使用 模式内修饰符设置 (?U)进行设置, 或者在量词后以问号标记其非贪婪(比如.*?)。
Note: 在非贪婪模式,通常不能匹配超过 pcre.backtrack_limit 的字符。
X (PCRE_EXTRA)
这个修饰符打开了 PCRE 与 perl 不兼容的附件功能。模式中的任意反斜线后就 ingen一个没有特殊含义的字符都会导致一个错误,以此保留这些字符以保证向后兼容性。 默认情况下,在 perl 中,反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文。 当前没有其他特性由这个修饰符控制。
J (PCRE_INFO_JCHANGED)
内部选项设置(?J)修改本地的PCRE_DUPNAMES选项。允许子组重名, (译注:只能通过内部选项设置,外部的 /J 设置会产生错误。)
u (PCRE_UTF8)
此修正符打开一个与 perl 不兼容的附加功能。 模式字符串被认为是utf-8的. 这个修饰符 从 unix 版php 4.1.0 或更高,win32版 php 4.2.3 开始可用。 php 4.3.5 开始检查模式的 utf-8 合法性。
正则例题
1.非负整数
"/^\d+$/"
以数字开头,并允许多个匹配,以数字结尾
2.匹配正整数
"/^[1-9]*[1-9][0-9]*$/"
以数字开头结尾,并且至少有一位是1-9的一个
3.非正整数
"/^(-\d+|(0+))$/"
以‘-’或‘0’开头
4.负整数
"/^-[0-9]*[1-9][0-9]*$/"
以‘-’开头,至少有一位是1-9的一个(不为0)
5.整数
"/^-?\d+$/"
至少有一个数值
6.非负浮点数
"/^\d+\.\d+$/"
至少存在小数点,并且以数字开头结尾
7.正浮点数
"/((^\d+\.\d*[1-9]\d*$)|(^\d*[1-9]\d*\.\d+$))/"
至少存在小数点,且小数点的两侧都要有数字,且至少一侧的数字不全是0,以数字结尾
8.非正浮点数
"/^-\d+\.\d+$/"
以‘-’开头,至少存在小数点,且小数点两侧都要存在数字,以数字结尾
9.负浮点数
"/((^-\d*[1-9]\d*\.\d+$)|(^-\d+\.\d*[1-9]\d*$))/"
以‘-’开头,必须存在小数点‘.’,且小数点两侧都要有数字,且至少小数点的一侧不全是0,以数字结尾
10.浮点数
"/^-?\d+\.\d+$/"
以数字或‘-’开头,以数字结尾,且必须有小数点
11.有数字、26个英文字母组成的字符串
"/^[0-9a-zA-Z]+$/"
12.长度为8-10的用户密码(以字母开头、数字、下划线)
"/^(?=[a-zA-Z])[a-zA-Z0-9_]{8,10}$/"
有些可能有更优的匹配模式,欢迎大家指正,可以在评论中进行吐槽