jQuery - 如何使这项工作(标记替换)

时间:2010-06-21 11:32:25

标签: javascript jquery html

目前我有:

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>标记仍然被删除,我做错了什么?

2 个答案:

答案 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

当尝试返回'&lt; script&gt;'时,代码会发生奇怪的事情匹配脚本时,在这些情况下可能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>