Heim >Web-Frontend >js-Tutorial >Detaillierte Erläuterung der Verwendung regulärer Mustermodifikatoren

Detaillierte Erläuterung der Verwendung regulärer Mustermodifikatoren

php中世界最好的语言
php中世界最好的语言Original
2018-03-30 13:35:381873Durchsuche

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

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)
Wenn dieser Modifikator festgelegt ist, wird das Muster gezwungen, ein „verankertes“ Muster zu sein, was bedeutet, dass die Übereinstimmung darauf beschränkt ist, nur vom Anfang des Ziels an zu suchen Zeichenfolge. Dieser Effekt kann auch mit entsprechenden Mustern konstruiert werden und ist die einzige Möglichkeit, dieses Muster in Perl zu implementieren.
D (PCRE_DOLLAR_ENDONLY)
Wenn dieser Modifikator festgelegt ist, stimmt das Metazeichen-Dollarzeichen im Muster nur mit dem Ende der Zielzeichenfolge überein. Wenn dieser Modifikator nicht festgelegt ist und die Zeichenfolge mit einem Zeilenumbruchzeichen endet, stimmt das Dollarzeichen auch mit diesem Zeilenumbruchzeichen überein (jedoch nicht mit einem vorangehenden Zeilenumbruchzeichen). Wenn der Modifikator m gesetzt ist, wird dieser Modifikator ignoriert. Es gibt kein Äquivalent dieses Modifikators in Perl.
S
Wenn ein Muster mehrmals verwendet werden muss, lohnt es sich, etwas Zeit in die Durchführung zusätzlicher Analysen zu investieren, um die Übereinstimmungsgeschwindigkeit zu verbessern. Wenn dieser Modifikator gesetzt ist, wird diese zusätzliche Analyse durchgeführt. Derzeit gilt diese Analyse eines Musters nur für nicht verankerte Musterübereinstimmungen (d. h. ohne ein einzelnes festes Startzeichen).
U (PCRE_UNGREEDY)
Dieser Modifikator kehrt den „gierigen“ Modus des Quantifizierers um. Machen Sie den Quantor standardmäßig nicht gierig. Sie können ihn gierig machen, indem Sie dem Quantor ein ? folgen. Dies ist mit Perl nicht kompatibel. Es kann auch mithilfe der Intra-Mode-Modifizierereinstellung (?U) oder durch Markieren als nicht gierig mit einem Fragezeichen nach dem Quantifizierer (z. B. .*?) festgelegt werden.
Hinweis:

Im nicht gierigen Modus können Zeichen, die pcre.backtrack_limit überschreiten, normalerweise nicht zugeordnet werden.

X (PCRE_EXTRA)
Dieser Modifikator aktiviert die Anhangsfunktion, die zwischen PCRE und Perl nicht kompatibel ist. Jeder umgekehrte Schrägstrich im Muster, gefolgt von einem Zeichen ohne besondere Bedeutung, führt zu einem Fehler. Diese Zeichen werden aus Gründen der Abwärtskompatibilität beibehalten. Standardmäßig wird in Perl ein Backslash gefolgt von einem Zeichen ohne besondere Bedeutung als Originaltext dieses Zeichens betrachtet. Derzeit werden keine anderen Funktionen von diesem Modifikator gesteuert.
J (PCRE_INFO_JCHANGED)
Interne Optionseinstellungen (?J) ändern die lokale PCRE_DUPNAMES-Option. Untergruppen mit doppelten Namen zulassen (Anmerkung: Kann nur durch interne Optionen festgelegt werden, externe /J-Einstellungen erzeugen Fehler.)
u (PCRE_UTF8)
Dieser Modifikator öffnet eine Datei, die nicht vorhanden ist Kompatibel mit Perl. Kompatible Zusatzfunktionen. Musterzeichenfolgen gelten als UTF-8. Dieser Modifikator ist ab PHP 4.1.0 für Unix und PHP 4.2.3 für Win32 verfügbar. PHP 4.3.5 beginnt mit der Überprüfung der UTF-8-Gültigkeit von Mustern.

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Detaillierte Erläuterung der Verwendung von d-Metazeichen in regulären Ausdrücken (mit Code)

Verwendung regulärer Ausdrücke unter Linux Ausführliche Einführung

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung regulärer Mustermodifikatoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn