这是来自Kohana框架的Input_Core类的xss_clean方法的一段代码:
do
{
// Remove really unwanted tags
$old_data = $data;
$data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
}
while ($old_data !== $data);
do ... while循环是否必要?我认为preg_replace调用只需一次迭代即可完成所有工作。
答案 0 :(得分:3)
嗯,如果替换可能会在下一次迭代中创建新匹配。这不是很浪费,因为它只是在最坏的情况下进行额外检查。
通过它匹配的代码,它似乎不太可能通过替换创建新的匹配,但是:它对它匹配的内容非常严格。
编辑:更具体地说,它尝试匹配一个开口尖括号,后面跟一个斜杠,后跟一个几个关键字,可选地跟随任意数量的符号,这些符号不是一个右尖括号,最后是一个结束尖括号。如果输入遵循该语法,则它将被吞噬整个。如果它格式不正确(例如多个打开和关闭尖括号),它将生成垃圾,直到它找不到与初始序列匹配的子串。
所以,不。除非你有像<<iframe>iframe>
这样的代码,否则不需要重复。但是你正在处理一个标记汤的级别,正则表达式无论如何都不够好(例如,< iframe>
会因额外空间而失败。)
EDIT2:模式在标签的开头匹配零或更多斜线(它应该为零或一个)也有点奇怪。如果我的正则表达式知识不是太生疏,那么最终的*+
也没有多大意义(星号意味着零或更多,加号意味着一个或多个,也许它是一个贪婪的语法或类似于那样的东西?)。
答案 1 :(得分:2)
在一个完全不相关的主题上,我想在这里添加一个关于优化的词。
preg_replace()可以告诉您是否已进行替换(请参阅第5个参数,该参数通过引用传递)。它比比较字符串效率高得多,特别是如果它们很大。