2010-06-21 103 views
0

目前我有:jQuery的 - 我怎样才能使这项工作(标签替换)

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

+1

似乎是一个坏主意,操作HTML与这样的正则表达式... – jAndy 2010-06-21 11:51:51

+1

刚跑到你的代码,指出它回到自己引用$(“身体”)不是这个”。 提出了标签和匹配的警报。 我得到/ p的标签,它不是/ p,因为它出现为“p”。 并且脚本的标签以“s”出现 我有什么问题吗? – 2010-06-21 11:51:55

回答

3

现在我非常确定,正则表达式并不适用于关闭标签,并且只会寻找i-z不会捕获完整标签。

尝试的正则表达式:

/<\(/?[a-z]+)[^>]*>/gi

一些奇怪的代码发生,虽然当试图返回“<脚本>”在这种情况下,也许匹配脚本时,所以return match

安迪·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> 
+0

Worked groovy ,欢呼多了。 – 2010-06-21 13:05:53

+0

+1,根本没有看到[i-z]位,我的注意力被这些三元操作符所吸引:-) – 2010-06-21 13:12:06

+0

@Andy:可惜你不能做出正确的答案,因此每个人都能得到答案。 – 2010-06-21 13:44:31

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; 

但是这些通常不易读和难以维护。

+0

或者你可能想为你的多个if/else if/else构造使用switch语句 - 我想这只是个人偏好的问题。 – 2010-06-21 12:34:50

+0

@Ken,是的,这是另一种选择,我已经添加了一个例子。 – 2010-06-21 12:36:16

+0

如果匹配'x'或'/ x',难道你不能通过数组'''''''script']来减少大量重复,只将它包装在<>中?只是好像'p'和'script'在那里写了很多.. – Jeriko 2010-06-21 12:52:00

相关问题