Maison  >  Article  >  interface Web  >  Explication détaillée de l'utilisation des modificateurs de motif réguliers

Explication détaillée de l'utilisation des modificateurs de motif réguliers

php中世界最好的语言
php中世界最好的语言original
2018-03-30 13:35:381785parcourir

这次给大家带来正则的模式修饰符使用详解,使用正则模式修饰符的注意事项有哪些,下面就是实战案例,一起来看一下。

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

本特性已自 PHP 5.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[&#39;html&#39;];// uppercase headings
$html = preg_replace(
&#39;(<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

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

. 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[&#39;html&#39;];// uppercase headings
$html = preg_replace_callback(
&#39;(<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)
Si ce modificateur est défini, le motif est forcé à être un motif "ancré", ce qui signifie que la correspondance est contrainte de rechercher uniquement à partir du début de la cible chaîne. Cet effet peut également être construit à l'aide de modèles appropriés et constitue le seul moyen d'implémenter ce modèle en Perl.
D (PCRE_DOLLAR_ENDONLY)
Si ce modificateur est défini, le métacaractère dollar dans le modèle correspond uniquement à la fin de la chaîne cible. Si ce modificateur n'est pas défini, lorsque la chaîne se termine par un caractère de nouvelle ligne, le signe dollar correspondra également à ce caractère de nouvelle ligne (mais pas à tout caractère de nouvelle ligne précédent). Si le modificateur m est défini, ce modificateur est ignoré. Il n'existe pas de modificateur équivalent en Perl.
S
Lorsqu'un modèle doit être utilisé plusieurs fois, afin d'améliorer la vitesse de correspondance, il vaut la peine de consacrer du temps à y effectuer une analyse supplémentaire. Si ce modificateur est défini, cette analyse supplémentaire sera effectuée. Actuellement, cette analyse d'un modèle s'applique uniquement aux correspondances de modèles non ancrées (c'est-à-dire sans un seul caractère de début fixe).
U (PCRE_UNGREEDY)
Ce modificateur inverse le mode "gourmand" du quantificateur. Rendre le quantificateur non gourmand par défaut. Vous pouvez le rendre gourmand en suivant le quantificateur avec ?. Ceci est incompatible avec Perl. Il peut également être défini à l'aide du paramètre de modificateur intra-mode (?U), ou en le marquant comme non gourmand avec un point d'interrogation après le quantificateur (par exemple .*?).
Remarque :

En mode non gourmand, les caractères dépassant pcre.backtrack_limit ne correspondent généralement pas.

X (PCRE_EXTRA)
Ce modificateur active la fonction de pièce jointe qui est incompatible entre PCRE et Perl. Toute barre oblique inverse dans le modèle suivie d'un caractère sans signification particulière entraînera une erreur, ces caractères sont conservés pour des raisons de compatibilité ascendante. Par défaut, en Perl, une barre oblique inverse suivie d'un caractère sans signification particulière est considérée comme le texte original de ce caractère. Aucune autre fonctionnalité n'est actuellement contrôlée par ce modificateur.
J (PCRE_INFO_JCHANGED)
Les paramètres d'option internes (?J) modifient l'option PCRE_DUPNAMES locale. Autoriser les sous-groupes avec des noms en double, (Annotation : ne peut être défini que par des options internes, les paramètres /J externes généreront des erreurs.)
u (PCRE_UTF8)
Ce modificateur ouvre un fichier qui n'est pas compatible avec Perl Fonctionnalités supplémentaires compatibles. Les chaînes de modèle sont considérées comme UTF-8. Ce modificateur est disponible à partir de PHP 4.1.0 ou supérieur pour Unix et PHP 4.2.3 pour Win32. PHP 4.3.5 commence à vérifier la validité utf-8 des modèles.

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php !

Lecture recommandée :

Explication détaillée de l'utilisation des métacaractères d dans les expressions régulières (avec code)

Utilisation des expressions régulières sous Linux Présentation détaillée

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn