怀疑功能($ 0,$ 1); // $ 0,$ 1两个参数 我的问题是这两个论点都没有定义但是它上面有一些数据???
可以任何帮助理解 这两个论点如何运行;
function strip_tags(input, allowed) {
allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join('');
//console.log('----------->'+allowed.join('ss'));
var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
return input.replace(commentsAndPhpTags,'').replace(tags, function ($0, $1) { // need help to understand $0 , $1
//console.log('----------->'+$1);
return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
});
}
答案 0 :(得分:1)
这是清理标记的一种非常糟糕的方法。它几乎可以保证有一些漏洞。一种更简单的方法就是剥离所有标记:
var stripTags = function(str) {
return str.replace(/<[^>]+>/g, '');
};
只要允许特定元素,最好编写一个标记化器,遍历标记,删除不允许的所有内容,然后从这些标记输出标记。
但是如果你不打算写一个标记器,这将是一个更好的方法,即使它仍然是粗糙的:
var allowed = { p: true, a: true };
var sanitize = function(str) {
return str.replace(/<\s*\/?\s*([^\s>]+)[^>]*>/g, function(tag, name) {
if (!allowed[name.toLowerCase()]) {
return '';
}
return tag;
});
};
但正如上面的评论所提到的,如果您只是在客户端清理用户的标记,那么这是一个主要问题。您需要在服务器端进行清理。
答案 1 :(得分:0)
return input.replace(commentsAndPhpTags, '').replace(tags, function (input, group1) {
//console.log('----------->'+group1);
return allowed.indexOf('<' + group1.toLowerCase() + '>') > -1 ? input : '';
});
你的正则表达式/<\/?([a-z][a-z0-9]*)\b[^>]*>/gi
只包含一个组匹配,它将是括号([a-z][a-z0-9]*)
内的内容,replace()
将传递给你的函数原始字符串并且组匹配。
然而,您的正则表达式应该与此/(<\/?[a-z][a-z0-9]*\b[^>]*>)/gi
类似,以便能够剥离标记。