2010-06-21 104 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

相關問題