まず、正規表現における貪欲とは何か、非貪欲とは何かについて少し学びましょう。あるいは、何が優先量指定子と一致し、何が優先量指定子を無視するのでしょうか?
わかりました、概念が何なのかはわかりませんが、例を挙げてみましょう。
ある学生は、コンテンツをフィルタリングしたいと考え、通常のルールと手順をこのように書きました。
$str = preg_replace('%<script>.+?</script>%i','',$str);//非贪婪
何も問題がないように思えますが、実際はそうではありません。
$str = '<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>';
の場合、上記の手順の後、結果は
$str = '<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>'; $str = preg_replace('%<script>.+?</script>%i','',$str);//非贪婪 print_r($str); //$str 输出为 <script>alert(document.cookie)</script>
であり、まだ彼が望む効果を達成できません。上記は貪欲ではなく、怠惰と呼ばれるものもあります。貪欲でないことを示す記号は、+?、*?、?? などの定量的なメタ文字の後に ? を追加することです (さらに特別なことについては、今後のブログで書きます)。つまり、?を書かない場合は貪欲を意味します。例えば
$str = '<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>'; $str = preg_replace('%<script>.+</script>%i','',$str);//非贪婪 print_r($str); //$str 输出为