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

高洛峰
リリース: 2023-03-04 17:16:02
オリジナル
1855 人が閲覧しました

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

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

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

$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 输出为 
        
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート