正则表达式模式修饰符
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)
Warning
本特性已自PHP5.5.0起废弃。强烈建议不要使用本特性。
如果设置了这个被弃用的修饰符,preg_replace()在进行了对替换字符串的后向引用替换之后,将替换后的字符串作为php代码评估执行(eval函数方式),并使用执行结果作为实际参与替换的字符串。单引号、双引号、反斜线(\)和NULL字符在后向引用替换时会被用反斜线转义.
Caution
Theaddslashes()functionisrunoneachmatchedbackreferencebeforethesubstitutiontakesplace.Assuch,whenthebackreferenceisusedasaquotedstring,escapedcharacterswillbeconvertedtoliterals.However,characterswhichareescaped,whichwouldnormallynotbeconverted,willretaintheirslashes.Thismakesuseofthismodifierverycomplicated.
Caution
请确保replacement参数由合法php代码字符串组成,否则php将会在preg_replace()调用的行上产生一个解释错误。
Caution
Useofthismodifierisdiscouraged,asitcaneasilyintroducesecurityvulnerabilites:
<?php $html=$_POST['html'];//uppercaseheadings $html=preg_replace( '(<h([1-6])>(.*?)</h\1>)e', '"<h$1>".strtoupper("$2")."</h$1>"', $html );
Theaboveexamplecodecanbeeasilyexploitedbypassinginastringsuchas<h1>{${eval($_GET[php_code])}}</h1>.ThisgivestheattackertheabilitytoexecutearbitraryPHPcodeandassuchgiveshimnearlycompleteaccesstoyourserver.
Topreventthiskindofremotecodeexecutionvulnerabilitythepreg_replace_callback()functionshouldbeusedinstead:
<?php $html=$_POST['html'];//uppercaseheadings $html=preg_replace_callback( '(<h([1-6])>(.*?)</h\1>)', function($m){ return"<h$m[1]>".strtoupper($m[2])."</h$m[1]>" }, $html );
Note:
仅preg_replace()使用此修饰符,其他PCRE函数忽略此修饰符。
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版php4.1.0或更高,win32版php4.2.3开始可用。php4.3.5开始检查模式的utf-8合法性。