目前我有:
this.html(this.html().replace(/<\/?([i-z]+)[^>]*>/gi, function(match, tag) {
return (tag === 'p') ? match : '<p>';
return (tag === '/p') ? match : '</p>';
return (tag === 'script') ? match : 'script';
return (tag === '/script') ? match : '/script';
}));
但是,<p>
和<script>
标记仍然被删除,我做错了什么?
答案 0 :(得分:7)
您不能对这样的三元运算符使用多个return语句。第一个将被评估,其余的将被忽略。使用正确的if
语句或switch
语句
if (tag === 'p')
return '<p>';
else if (tag === '/p')
return '</p>';
else if (tag === 'script')
return 'script';
else if (tag === '/script')
return '/script';
else
return match;
switch
示例:
switch (tag) {
case 'p': return '<p>';
case '/p': return '</p>';
//...
case default: return match;
}
您还可以将对象用作地图,
var map { 'p': '<p>', '/p' : '</p>' /*, ... */ };
return map[tag] || match;
或嵌套的三元运算符,
return tag === 'p' ? '<p>'
: tag === '/p' ? '</p>'
: tag === 'script' ? '<script>'
: tag === '/script' ? '</script>'
: match;
但这些通常不太可读,难以维护。
答案 1 :(得分:3)
我现在很确定这一点,正则表达式不能用于关闭标签,只有找到i-z才能捕获完整的标签。
尝试使用正则表达式:
/<\(/?[a-z]+)[^>]*>/gi
return match
Andy E的负责人建议改变if语句结构我认为也有帮助,主要是
else
return match;
或者甚至将其作为默认值而不是专门查找p和脚本标记,如果没有满足if语句,它将返回匹配标记的匹配值。
我编写的代码用于测试:
<!DOCTYPE HTML>
<html>
<body>
<div id="manipulate">
<p>Hello</p>
<script type="text/ecmascript">
// test
</script>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/ecmascript"></script>
<script type="text/ecmascript">
$(document).ready(function(){
alert("start");
$("#manipulate").html($("#manipulate").html().replace(/<\/?([a-z]+)[^>]*>/gi, function(match, tag) {
alert(tag);
alert(match);
if (tag === 'p')
return '<p>';
else if (tag === '/p')
return '</p>';
else if (tag === 'script')
return match;
else if (tag === '/script')
return match;
else
return match;
}));
});
</script>
</body>
</html>