php zhegnze_PHP: 正则表达式模式中可用的模式修饰符 - Manual

i (PCRE_CASELESS)

如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。

m (PCRE_MULTILINE)

默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行),

"行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾,

或者最后的换行符(除非设置了 D 修饰符)。这个行为和 perl 相同。

当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外,

还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。如果目标字符串

中没有 "\n" 字符,或者模式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响。

s (PCRE_DOTALL)

如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个

修饰符,点号不匹配换行符。这个修饰符等同于 perl 中的/s修饰符。 一个取反字符类比如

[^a] 总是匹配换行符,而不依赖于这个修饰符的设置。

x (PCRE_EXTENDED)

如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略,

并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。

这个修饰符

等同于 perl 中的 /x 修饰符,使被编译模式中可以包含注释。 注意:这仅用于数据字符。 空白字符

还是不能在模式的特殊字符序列中出现,比如序列 (?( 引入了一个条件子组(译注: 这种语法定义的

特殊字符序列中如果出现空白字符会导致编译错误。 比如(?(就会导致错误)。

e (PREG_REPLACE_EVAL)

警告

This feature was

DEPRECATED in PHP 5.5.0, and REMOVED as of PHP 7.0.0.

如果设置了这个被弃用的修饰符, \)和 NULL 字符在

后向引用替换时会被用反斜线转义.

警告

The

警告

请确保 replacement 参数由合法 php 代码字符串组成,否则 php 将会

警告

不建议使用此修饰符,它很容易产生安全漏洞:

$html=$_POST['html'];// uppercase headings$html=preg_replace('((.*?))e','"" . strtoupper("$2") . ""',$html);

以上示例代码能够被这样的字符串利用:

{${eval($_GET[php_code])}}

这能让攻击者执行他们想要的 PHP 代码,几乎完全渗透进服务器。

$html=$_POST['html'];// uppercase headings$html=preg_replace_callback('((.*?))',

function ($m) {

return"".strtoupper($m[2]) ."";

},$html);

注意:

A (PCRE_ANCHORED)

如果设置了这个修饰符,模式被强制为"锚定"模式,也就是说约束匹配使其仅从

目标字符串的开始位置搜索。这个效果同样可以使用适当的模式构造出来,并且

这也是 perl 种实现这种模式的唯一途径。

D (PCRE_DOLLAR_ENDONLY)

如果这个修饰符被设置,模式中的元字符美元符号仅仅匹配目标字符串的末尾。如果这个修饰符

没有设置,当字符串以一个换行符结尾时, 美元符号还会匹配该换行符(但不会匹配之前的任何换行符)。

如果设置了修饰符m,这个修饰符被忽略. 在 perl 中没有与此修饰符等同的修饰符。

S

当一个模式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间

对其进行一些额外的分析。如果设置了这个修饰符,这个额外的分析就会执行。当前,

这种对一个模式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符)。

U (PCRE_UNGREEDY)

这个修饰符逆转了量词的"贪婪"模式。 使量词默认为非贪婪的,通过量词后紧跟?

的方式可以使其成为贪婪的。这和 perl 是不兼容的。 它同样可以使用

模式内修饰符设置

(?U)进行设置, 或者在量词后以问号标记其非贪婪(比如.*?)。

注意:

X (PCRE_EXTRA)

这个修饰符打开了 PCRE 与 perl 不兼容的附件功能。模式中的任意反斜线后就 ingen 一个

没有特殊含义的字符都会导致一个错误,以此保留这些字符以保证向后兼容性。

默认情况下,在 perl 中,反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文。

当前没有其他特性由这个修饰符控制。

J (PCRE_INFO_JCHANGED)

内部选项设置(?J)修改本地的PCRE_DUPNAMES选项。允许子组重名,

(译注:只能通过内部选项设置,外部的 /J 设置会产生错误。)

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值