ホームページ  >  記事  >  バックエンド開発  >  PHP 正規表現効率の貪欲分析、非貪欲分析、およびバックトラッキング分析 (推奨)

PHP 正規表現効率の貪欲分析、非貪欲分析、およびバックトラッキング分析 (推奨)

高洛峰
高洛峰オリジナル
2017-01-09 10:16:421789ブラウズ

まず、正規表現における貪欲とは何か、非貪欲とは何かについて少し学びましょう。あるいは、何が優先量指定子と一致し、何が優先量指定子を無視するのでしょうか?

わかりました、概念が何なのかはわかりませんが、例を挙げてみましょう。

ある学生は、コンテンツをフィルタリングしたいと考え、通常のルールと手順をこのように書きました。

$str = preg_replace(&#39;%<script>.+?</script>%i&#39;,&#39;&#39;,$str);//非贪婪

何も問題がないように思えますが、実際はそうではありません。

$str = &#39;<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>&#39;;

の場合、上記の手順の後、結果は

$str = &#39;<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>&#39;;
$str = preg_replace(&#39;%<script>.+?</script>%i&#39;,&#39;&#39;,$str);//非贪婪
print_r($str);
//$str 输出为 <script>alert(document.cookie)</script>

であり、まだ彼が望む効果を達成できません。上記は貪欲ではなく、怠惰と呼ばれるものもあります。貪欲でないことを示す記号は、+?、*?、?? などの定量的なメタ文字の後に ? を追加することです (さらに特別なことについては、今後のブログで書きます)。つまり、?を書かない場合は貪欲を意味します。例えば ​​

$str = &#39;<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>&#39;;
$str = preg_replace('%<script>.+</script>%i','',$str);//非贪婪
print_r($str);
//$str 输出为