【小白笔记】PHP学习之路 (33) --正则表达式

来源:互联网 发布:上海网络测速 编辑:程序博客网 时间:2024/04/27 22:52

定界符:除了字母、数字和反斜线\以外的任何字符都可以为定界符号,比如 | |、//、{}、!!、()等等,

                但是需要注意,如果没有特殊需要,我们都使用正斜线//作为正则表达式的定界符号。

原子:正则表达式中最小的单位。\d、\s或任意一个匹配字符a、b、c都是原子。


元字符:

.         匹配除换行符以外任意字符。

^        匹配字符串开头。

$       匹配字符串结尾。

\w     匹配字母、数组、下划线或汉字。

\d     匹配数字。

\b     匹配单词的开头或结束。

\s     匹配任意的空白符。如空格、制表符、换行符、中文全角空格。


重复:

?      重复0次或1次。

+      重复1次或多次。

*      重复0次或多次。

{n}   重复n次。

{n,m}    重复n次到m次。

{n,}        重复n次或更多次。


字符集:

[abc]     匹配a或b或c。

[^abc]   匹配除abc以外的字符。

[0-9]      匹配一位数字。

[a-zA-Z]     匹配一个字母。

[aeiou]      匹配任意一个元音字母。


反义匹配:

\W     匹配非字母、数组、下划线或汉字。

\D      匹配非数字。

\S      匹配非空白符。

\B      匹配不是单词开头或结束的位置

[^a]     匹配任意一个不是a的字符。

[^abc]   匹配除了abc这几个字母以外的任意字符。


分枝条件:

abc|def     匹配abc或def。分枝条件的优先级最低。


分组条件:

ab(cde){1,3}f    匹配abcdef或abcedcedf或abcdecdecdef。默认会为分组匹配结果分配序号,可通过\n或${n}引用前面第n个匹配结果。

(?<group>exp)    匹配exp并为匹配结果分配组名group,后面可以通过\k<group>引用。同(?'group')。

(?:exp)        只匹配exp而不分组。

(?#comment)        使用注释。此表达式不对匹配结果产生任何影响。

\k<group>     引用名为group的匹配组。


断言匹配:

(?=exp)       匹配后面为exp的位置。

(?<=exp)     匹配前面为exp的位置。

(?!exp)         匹配后面不是exp的位置。

(?<!exp)      匹配前面不是exp的位置。


贪婪匹配与懒惰匹配:

正则表达式进行匹配时,默认按照“尽可能多地匹配”的原则进行匹配,即如果用"\d+"来匹配"123456789",得到的结果是"123456789",而不是"1"。

如果不想使用贪婪匹配,可以使用?修饰符来使用懒惰匹配。

*?      重复任意次,但尽可能少重复

+?     重复一次或多次,但尽可能少重复

??     重复0次或1次,但尽可能少重复

{n,m}?     重复n次到m次,但尽可能少重复。

{n,}?        重复n次以上,但尽可能少地重复。


模式修正符:

i        忽略大小写(IgnoreCase)。

m     多行模式(Multiline),更改^$的 含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在

         整个字符串的开头和结尾匹配。(在此模式下,$的 精确含意是:匹配\n之前的位置以及字符串结束前的位置.)

s      单行模式(Singleline)。更改.的含义,使它与每一个字符匹配(包括换行符\n)。即使有\n,也当做单行进行匹配。

x       忽略表达式中的空格(IgnorePatternWhitespace)。忽略表达式中的非转义空白并启用由#标记的注释。

e      在进行后向引用替换后对替换后的字符串执行eval()操作,并把执行后的字符串作为处理结果。

        * 本特性自PHP5.5.0起废弃,建议不要使用。

U     禁止贪婪匹配。

A      强制使^从整个字符串开始匹配。

D      强制使$作为整个字符串结尾匹配。

* 可以同时使用多个模式修正符。


其他:

\\n      后向引用第n个匹配。也可以使用${n},注意转义。

\Z      匹配字符串结尾或行尾(不受处理多行选项的影响)

\z       匹配字符串结尾(类似$,但不受处理多行选项的影响)

\A      匹配字符串开头(类似^,但不受处理多行选项的影响)


平衡/递归匹配:

(?'group')或(?<group>)       把捕获的内容命名为group,并压入堆栈(Stack)。

(?'-group')                              从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败

(?(group)yes|no)                  如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分

(?!)                                          零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

例:匹配HTML嵌套的<div>标签<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>


PHP正则表达式操作函数:

preg_match()      查找字符串,找到返回1,否则返回0。

                              传递第三个参数,将结果放到数组中(匹配结果和出现的位置)。

                              传递第四个参数,可以获得偏移量。

                               第五个参数指定开始查找的位置。

preg_match_all()      匹配并将结果放到指定的数组中。参数同上。

preg_grep()     使用正则表达式匹配数组元素,以数组形式返回匹配结果,保留索引。可使用array_values()清除原索引。

                           如果添加第三个参数PREG_GREP_INVERT,则返回与正则不匹配的元素(反转)。

preg_split()      通过一个正则表达式分隔字符串。以数组形式返回结果。第三个参数指定分割子串数,-1、0或null都表示

                          不限制。指定第四个参数PREG_SPLIT_NO_EMPTY, 返回分割后的非空部分。

                          指定参数PREG_SPLIT_OFFSET_CAPTURE,返回偏移量(即匹配位置)。

* 可以同时使用多个参数,使用+连接即可。如:PREG_SPLIT_NO_EMPTY+PREG_SPLIT_OFFSET_CAPTURE。

preg_replace()      使用正则匹配并替换。作用于字符串。如果传入含多个正则表达式的数组,同时传入要替换为的数组,

                                 则一个正则表达式对应一条替换内容。传递第四个参数指定替换次数,-1代表全部替换。第五个参数

                                 用于统计实际替换数量。

preg_replace_callback()      与preg_replace()相似,但是可以自定义回调函数,使用回调函数处理后再替换(第二个参数)。

                                                  其他参数一样。

create_function()      创建一个匿名函数,两个字符串参数。第一个为匿名函数的参数,第二个为函数体代码。注意转义。

preg_filter()      执行一个正则表达式搜索和替换。与preg_replace()基本相同,参数一样,唯一不同的是它只返回与目标

                           匹配的结果,而preg_replace()返回所有的内容(无论是否匹配)。



 

                                



0 0
原创粉丝点击