正则表达式方式修饰符,正则表达式修饰符

上面列出了现阶段可用的 PCRE 修饰符。括号中涉及的名字是 PCRE
内部这个修饰符的名称。
方式修饰符中的空格,换行符会被忽略,别的字符会导致错误。

正则表达式方式修饰符,正则表明式修饰符

i (PCRE_CASELESS)

万1设置了那几个修饰符,情势中的字母会议及展览开高低写不灵敏相称。

m (PCRE_MULTILINE)

暗许境况下,PCRE
以为目的字符串是由单行字符组成的(然则事实上它恐怕会蕴藏多行),
“行首”元字符 (^) 仅相配字符串的开始地方, 而”行末”元字符 ($)
仅相称字符串末尾, 大概最后的换行符(除非设置了 D 修饰符)。这几个作为和
perl 一样。
当这几个修饰符设置之后,“行首”和“行末”就可以协作目的字符串中任性换行符在此之前或之后,此外,
还各自相称目的字符串的最起初和最末尾地点。那同一 perl 的 /m
修饰符。若是目的字符串 中从不 “\n” 字符,或然格局中一贯不出现 ^ 或
$,设置这一个修饰符不爆发任何影响。

s (PCRE_DOTALL)

假定设置了这一个修饰符,形式中的点号元字符相称全数字符,包含换行符。假诺未有这一个修饰符,点号不相称换行符。那些修饰符等同于 perl 中的/s修饰符。
四个取反字符类比如 [^a] 总是相配换行符,而不借助于那么些修饰符的安装。

x (PCRE_EXTENDED)

假若设置了这几个修饰符,情势中的没有通过转义的或不在字符类中的空白数据字符总会被忽略,
并且位于3个未转义的字符类外部的#字符和下多个换行符之间的字符也被忽视。
那几个修饰符 等同于 perl 中的 /x 修饰符,使被编写翻译格局中能够涵盖注释。
注意:那仅用于数据字符。 空白字符
依然不可能在情势的特殊字符连串中出现,比如体系 (?(
引进了三个尺度子组(译注: 那种语法定义的
特殊字符连串中一旦出现空白字符会导致编写翻译错误。 举例(?(就能够招致错误)。

e (PREG_REPLACE_EVAL)

Warning

本特性已自 PHP 五.5.0 起抛弃。强烈提议不要使用性子格。

正则表达式方式修饰符,正则表达式修饰符。假诺设置了那个被弃用的修饰符, preg_replace() 在拓展了对替换字符串的
后向引用替换之后, 将替换后的字符串作为php 代码评估试行(eval
函数方式),并选取实行理并了结果
作为实际上参预替换的字符串。单引号、双引号、反斜线(\)和 NULL 字符在
后向引用替换时会被用反斜线转义.

Caution

The addslashes() function is run on each matched backreference before
the substitution takes place. As such, when the backreference is used as
a quoted string, escaped characters will be converted to literals.
However, characters which are escaped, which would normally not be
converted, will retain their slashes. This makes use of this modifier
very complicated.

Caution

请保管 replacement 参数由法定 php 代码字符串组成,不然 php 将会
在preg_replace() 调用的行上发生多个表明错误。

Caution

Use of this modifier is discouraged, as it can easily introduce security
vulnerabilites:

<?php
$html = $_POST['html'];// uppercase headings
$html = preg_replace(
'(<h([1-6])>(.*?)</h\1>)e',
'"<h$1>" . strtoupper("$2") . "</h$1>"',
$html
);

The above example code can be easily exploited by passing in a string
such as <h1>{${eval($_GET[php_code])}}</h1>. This gives
the attacker the ability to execute arbitrary PHP code and as such gives
him nearly complete access to your server.

To prevent this kind of remote code execution vulnerability the
preg_replace_callback() function should be used instead:

<?php
$html = $_POST['html'];// uppercase headings
$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)
1经设置了这么些修饰符,情势被威吓为”锚定”方式,也正是说约束相称使其仅从
目的字符串的启幕地方寻找。那个作用同样可以运用相当的形式协会出来,并且
那也是 perl 种落成这种方式的唯1渠道。
D (PCRE_DOLLAR_ENDONLY)
假定那个修饰符棉被服装置,格局中的元字符韩元符号仅仅相称目标字符串的最终。假使那几个修饰符
未有设置,当字符串以3个换行符结尾时,
澳元符号还会同盟该换行符(但不会合作以前的任何换行符)。
假使设置了修饰符m,那个修饰符被忽略. 在 perl
中未有与此修饰符等同的修饰符。
S
当三个情势须要反复采用的时候,为了猎取匹配速度的晋升,值得开销一些时间
对其进展部13分加的剖析。借使设置了那些修饰符,那几个额外的解析就能够实行。当前,
那种对三个方式的分析仅仅适用于非锚定格局的匹配(即未有单独的牢固开头字符)。
U (PCRE_UNGREEDY)
以此修饰符反败为胜了量词的”贪婪”情势。 使量词默感觉非贪婪的,通过量词后紧跟?
的办法得以使其产生贪婪的。那和 perl 是不匹配的。 它同样能够动用
方式内修饰符设置 (?U)进行设置,
只怕在量词后以问号标志其非贪婪(举例.*?)。
Note:

在非贪婪方式,经常无法合作超越 pcre.backtrack_limit 的字符。

X (PCRE_EXTRA)
那么些修饰符展开了 PCRE 与 perl 不相配的附属类小部件功效。形式中的放肆反斜线后就
ingen 3个没有异样意义的字符都会变成三个张冠李戴,以此保留那些字符以管教向后包容性。
暗中同意情状下,在 perl
中,反斜线紧跟二个未曾优异含义的字符被感觉是该字符的原来的小说。
当前尚无其余特色由那个修饰符调整。
J (PCRE_INFO_JCHANGED)
当中甄选设置(?J)修改本地的PCRE_DUPNAMES选项。允许子组重名,
(译注:只可以通过内部甄选设置,外部的 /J 设置会生出错误。)
u (PCRE_UTF8)
此校对符张开3个与 perl 不相配的增大功用。 方式字符串被以为是utf-八的.
那么些修饰符 从 unix 版php 四.1.0 或越来越高,win3二版 php 4.贰.三 开头可用。 php
四.三.伍 起头检查形式的 utf-捌 合法性。

i
(PCRE_CASELESS)
若是设置了那些修饰符,方式中的字母会进展高低写不灵活相配。 m
(PCRE_MULTILIN…

 

i (PCRE_CASELESS)
class=”simpara”>固然设置了这一个修饰符,情势中的字母会进展高低写不敏感相配。

m (PCRE_MULTILINE)
默许情形下,PCRE
以为目标字符串是由单行字符组成的(然则事实上它只怕会包蕴多行),
“行首”元字符 (^) 仅相称字符串的发轫地点, 而”行末”元字符 ($)
仅相称字符串末尾, 可能最终的换行符(除非设置了 D 修饰符)。那些行为和
perl 一样。  class=”simpara”>当那个修饰符设置之后,“行首”和“行末”就能协作目的字符串中任性换行符此前或之后,此外,
还各自相称目的字符串的最开始和最末尾地方。那无差别于 perl 的 /m
修饰符。若是目的字符串 中没有 “\n” 字符,或然形式中尚无现身 ^ 或
$,设置这几个修饰符不爆发别的影响。

s (PCRE_DOTALL)
class=”simpara”>假如设置了那个修饰符,情势中的点号元字符相配全体字符,包涵换行符。假如未有那几个修饰符,点号不相配换行符。这几个修饰符等同于 perl 中的/s修饰符。
2个取反字符类比方 [^a]
总是相称换行符,而不依赖于这一个修饰符的安装。

x (PCRE_EXTENDED)
class=”simpara”>假设设置了那些修饰符,情势中的未有通过转义的或不在字符类中的空白数据字符总会被忽略,
并且位于三个未转义的字符类外部的#字符和下1个换行符之间的字符也被忽视。
那一个修饰符 等同于 perl 中的 /x 修饰符,使被编写翻译格局中得以涵盖注释。
注意:那仅用于数据字符。 空白字符
照旧不能够在情势的特殊字符系列中出现,举个例子连串 (?(
引进了3个口径子组(译注: 那种语法定义的
特殊字符体系中只要出现空白字符会导致编写翻译错误。
举个例子(?(就能招致错误)。

e (PREG_REPLACE_EVAL)
Warning
This feature was DEPRECATED in PHP 5.5.0, and REMOVED as of PHP
7.0.0.

class=”simpara”>假若设置了那一个被弃用的修饰符,  class=”function”>preg_replace() 在拓展了对替换字符串的
后向引用替换之后, 将替换后的字符串作为php 代码评估推行(eval
函数格局),并选择实行结果
作为实际上参预替换的字符串。单引号、双引号、反斜线(\)和 NULL 字符在
后向引用替换时会被用反斜线转义.

Caution
The  class=”function”>addslashes() function
is run on each matched backreference before the substitution takes
place. As such, when the backreference is used as a quoted string,
escaped characters will be converted to literals. However, characters
which are escaped, which would normally not be converted, will retain
their slashes. This makes use of this modifier very
complicated.

Caution
请确保 replacement 参数由官方 php 代码字符串组成,不然 php 将会
在 class=”function”>preg_replace() 调用的行上产生2个分解错误。

Caution
不建议使用此修饰符,它很轻松发生安全漏洞:

<?php$html = $_POST['html'];// uppercase headings$html = preg_replace(    '(<h([1-6])>(.*?)</h\1>)e',    '"<h$1>" . strtoupper("$2") . "</h$1>"',    $html);

以上示例代码可以被那样的字符串利用: <h1>{${eval($_GET[php_code]澳门葡京备用网址,)}}</h1>
那能让攻击者试行他们想要的 PHP 代码,大概全盘渗透进服务器。

为了挡住此类远程代码实践攻击,能够选择  class=”function”>preg_replace_callback() 替代:

<?php$html = $_POST['html'];// uppercase headings$html = preg_replace_callback(    '(<h([1-6])>(.*?)</h\1>)',    function ($m) {        return "<h$m[1]>" . strtoupper($m[2]) . "</h$m[1]>";    },    $html);

Note:

仅  > class=”function”>preg_replace() 使用此修饰符,别的PCRE 函数忽略此修饰符。

A (PCRE_ANCHORED)
class=”simpara”>要是设置了那么些修饰符,情势被挟持为”锚定”格局,也正是说约束相配使其仅从
目标字符串的起来地点搜索。这一个职能等同能够行使分外的情势组织出来,并且
那也是 perl 种达成那种方式的唯壹门路。

D (PCRE_DOLLAR_ENDONLY)
class=”simpara”>假使这一个修饰符被装置,方式中的元字符澳元符号仅仅匹配目的字符串的最终。如若那么些修饰符
未有安装,当字符串以一个换行符结尾时,
法郎符号还会合营该换行符(但不会合作从前的别的换行符)。
如若设置了修饰符m,那么些修饰符被忽略. 在 perl
中并未有与此修饰符等同的修饰符。

S
class=”simpara”>当一个形式必要反复运用的时候,为了赢得相称速度的晋级,值得开销一些岁月
对其展开局地额外的解析。假诺设置了这么些修饰符,那些额外的辨析就能够执行。当前,
那种对二个方式的剖析仅仅适用于非锚定方式的同盟(即未有单身的永远初始字符)。

U (PCRE_UNGREEDY)
class=”simpara”>这几个修饰符逆袭了量词的”贪婪”形式。
使量词默以为非贪婪的,通过量词后紧跟? 的秘诀得以使其改为贪婪的。那和
perl 是不相称的。
它壹律能够应用 情势内修饰符设置 (?U)进行设置,
恐怕在量词后以问号标志其非贪婪(比方.\?*)。

Note:

在非贪婪方式,常常无法相配超越 pcre.backtrack_limit 的字符。

X (PCRE_EXTRA)
其一修饰符张开了 PCRE 与 perl
不协作的附件效率。格局中的任性反斜线后就 ingen 二个未有例外含义的字符都会导致二个错误,以此保留那么些字符以保证向后包容性。
暗中同意景况下,在 perl
中,反斜线紧跟3个不曾异样意义的字符被感觉是该字符的初稿。
当前一向不任何特色由那些修饰符调整。

J (PCRE_INFO_JCHANGED)
class=”simpara”>内部甄选设置(?J)修改当地的PCRE_DUPNAMES选料。允许子组重名,
(译注:只好通过中间甄选设置,外部的 /J 设置会时有发生错误。)

u (PCRE_UTF8)
此革新符展开二个与 perl 不匹配的增大效率。
方式和目的字符串都被感到是 utf-8 的。 无效的对象字符串会形成 preg_*
函数什么都非凡不到; 无效的方式字符串会促成 E_WA昂CoraNING 级其他荒唐。
PHP 5.3.四 后,5字节和陆字节的 UTF-8 字符连串被考虑为无效(resp. PCRE
7.3 二〇〇六-0八-2八)。 以前就被以为是船到江心补漏迟的 UTF-八。

class=”simpara”>转自:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website