ホームページ  >  記事  >  ウェブフロントエンド  >  通常のパターン修飾子の使用方法の詳細な説明

通常のパターン修飾子の使用方法の詳細な説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-03-30 13:35:381806ブラウズ

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

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)
この修飾子が設定されている場合、パターンは強制的に「アンカーされた」パターンになります。これは、一致がターゲット文字列の先頭からのみ検索するように制限されることを意味します。この効果は適切なパターンを使用して構築することもでき、これがこのパターンを Perl で実装する唯一の方法です。
D (PCRE_DOLLAR_ENDONLY)
この修飾子が設定されている場合、パターン内のメタキャラクターのドル記号はターゲット文字列の末尾にのみ一致します。この修飾子が設定されていない場合、文字列が改行文字で終わる場合、ドル記号もその改行文字と一致します (ただし、先行する改行文字は一致しません)。 修飾子 m が設定されている場合、この修飾子は無視されます。perl には同等の修飾子はありません。
S
パターンを複数回使用する必要がある場合、マッチング速度を向上させるために、時間をかけて追加の分析を実行する価値があります。この修飾子が設定されている場合、この追加の分析が実行されます。現在、このパターン分析は、アンカーされていないパターン一致 (つまり、単一の固定開始文字なし) にのみ適用されます。
U (PCRE_UNGREEDY)
この修飾子は、量指定子の「貪欲」モードを逆転させます。 デフォルトで量指定子を非貪欲にする 量指定子の後に ? を付けると貪欲にできます。これは Perl と互換性がありません。 また、モード内修飾子設定 (?U) を使用するか、量指定子の後に疑問符を付けて非貪欲性をマークすることによって設定することもできます (例: .*?)。
注:

非貪欲モードでは、通常、pcre.backtrack_limit を超える文字は一致しません。

X (PCRE_EXTRA)
この修飾子は、PCRE と perl 間で互換性のないアタッチメント関数をオンにします。パターン内のバックスラッシュの後に特別な意味のない文字が続くとエラーが発生します。これらの文字は下位互換性のために保存されています。 デフォルトでは、perl では、バックスラッシュの後に特別な意味を持たない文字がその文字の元のテキストとみなされます。 現在、このモディファイアによって制御される他の機能はありません。
J (PCRE_INFO_JCHANGED)
内部オプション設定 (?J) ローカルの PCRE_DUPNAMES オプションを変更します。重複した名前を持つサブグループを許可します (注釈: 内部オプション経由でのみ設定できます。外部 /J 設定はエラーを生成します。)
u (PCRE_UTF8)
この修飾子は、perl と互換性のない追加機能を有効にします。 パターン文字列は UTF-8 とみなされます。この修飾子は、Unix の場合は PHP 4.1.0 以降、Win32 の場合は PHP 4.2.3 以降で使用できます。 PHP 4.3.5 では、パターンの utf-8 有効性のチェックが開始されます。

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨書籍:

正規表現での d メタキャラクターの使用の詳細な説明 (コード付き)

Linux での正規表現の使用の詳細な紹介

以上が通常のパターン修飾子の使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。