W3CAPI 在线教程 | 菜鸟教程_LOGO
文档目录
文档目录
我的书签
 

PHP

PHP正则表达式PCRE 匹配模式修饰符:/i,/s,/x,/u,/s等解析

正则表达式在软件技术中是比较重要的技术应用,它可以应用到各种业务逻辑中,比如输入验证、字符查找、数据采集、模板语法实现等。正则表达式有一套完整的使用语法,其中包括的模式修饰符在日常应用中起到了非常重要的作用,熟悉每一个模式修饰符的作用及用例是一个程序员的必备技能。

jesen
1
2020-04-21 08:51:12

PHP 正则表达式PCRE 模式修饰符总结

下面列表中是在PCRE中当前可用的 模式修饰符。括号中的名称是 PCRE 内部这些修饰符的名称。 模式修饰符中的空格,换行符会被忽略,其他字符会导致错误。
模式修饰符 说明 备注
i (PCRE_CASELESS) 如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配 忽略大小写进行匹配
m (PCRE_MULTILINE) 默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。这个行为和 perl 相同。 当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。如果目标字符串 中没有 "\n" 字符,或者模式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响 多行字符串的匹配
s (PCRE_DOTALL) 设置模式中的“.”点号元字符匹配所有字符,包含换行符。如果没有这个 修饰符,点号不匹配换行符。这个修饰符等同于 perl 中的/s修饰符。 取反元字符:比如 [^a] 总是匹配换行符,而不依赖于这个修饰符的设置  
x (PCRE_EXTENDED) 模式中的没有经过转义的或不在字符中的空白数据字符总会被忽略, 并且位于一个未转义的字符外部的#字符和下一个换行符之间的字符也被忽略。 这个修饰符 等同于 perl 中的 /x 修饰符,使被编译模式中可以包含注释。 注意:这仅用于数据字符。 空白字符 还是不能在模式的特殊字符序列中出现,比如序列 “(?( ”引入了一个条件子组(注: 这种语法定义的 特殊字符序列中如果出现空白字符会导致编译错误。 比如:
preg_match_all("/^\d?( .*)$/m",$str,$matches);
就会导致错误)
忽略模式串中的空格,但是模式串中尽量不要出现空格
e (PREG_REPLACE_EVAL) preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线(\)和 NULL 字符在 后向引用替换时会被用反斜线转义(仅 preg_replace() 使用此修饰符,其他 PCRE 函数忽略此修饰符) 不建议使用此修饰符,它很容易产生安全漏洞(在 PHP 5.5.0 中此模式修饰符已经被废弃, 在 PHP 7.0.0 中被彻底移除)
A (PCRE_ANCHORED) 此修饰符将模式强制为"固定"模式,也就是说约束匹配使其仅从 目标字符串的开始位置搜索。这个效果同样可以使用适当的模式构造出来,并且 这也是 perl 种实现这种模式的唯一途径 仅返回第一个匹配的字符序列
D (PCRE_DOLLAR_ENDONLY) 模式中的元字符美元符号仅仅匹配目标字符串的末尾。默认情况下,当字符串以一个换行符结尾时, 美元符号还会匹配该换行符(但不会匹配之前的任何换行符,也就是不会多行匹配)。 如果设置了修饰符m,这个修饰符被忽略. 在 perl 中没有与此修饰符等同的修饰符 指示是否匹配单行字符的结尾换行符
S 当一个模式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间 对其进行一些额外的分析。如果设置了这个修饰符,这个额外的分析就会执行。这种对一个模式的分析仅仅适用于非“固定”模式的匹配(即没有单独的固定开始字符)  
U (PCRE_UNGREEDY) 这个修饰符逆转量词的"贪婪"模式。 使量词为非贪婪的(通过量词后紧跟? 的方式可以使其成为贪婪的,这和 perl 是不兼容的), 它同样可以使用 模式内修饰符设置 (?U)进行设置, 或者在量词后以问号的形式标记其非贪婪(比如.*?),示例如下:
$matches = array();
$str = "aaaaaaaaaaaaaa";
preg_match_all("/a*/U",$str,$matches);
print_r($matches);
在非贪婪模式,通常不能匹配超过 pcre.backtrack_limit 的字符
X (PCRE_EXTRA) 这个修饰符打开了 PCRE 与 perl 不兼容的附件功能。模式中的任意反斜线后跟一个没有特殊含义的字符都会导致一个错误,以此保留这些字符以保证向后兼容性。 默认情况下,在 perl 中,反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文。 当前没有其他特性由这个修饰符控制 没有什么作用
J (PCRE_INFO_JCHANGED) 内部选项设置(?J)修改本地的PCRE_DUPNAMES选项。允许子组重名, (注:低版本的PHP只能通过内部选项设置,外部的 /J 设置会产生错误) 示例如下:
$matches = array();
preg_match_all('/(?<group1>\d{1,4})\-(?<group1>\d{1,2})/J', '1234-23', $matches);
var_dump($matches);
u (PCRE_UTF8) 此修正符打开一个与 perl 不兼容的附加功能。 模式和目标字符串都被认为是 utf-8 的。 无效的目标字符串会导致 preg_* 函数什么都匹配不到; 无效的模式字符串会导致 E_WARNING 级别的错误。 PHP 5.3.4 后,5字节和6字节的 UTF-8 字符序列被考虑为无效(resp. PCRE 7.3 2007-08-28)。 以前就被认为是无效的 UTF-8 以utf8编码进行模式匹配
相关提问
敬请期待