2014-09-05 38 views
0

我用的jsfiddle這裏打替換字符串:http://jsfiddle.net/dm9eebz9/無法使用正則表達式

HTML

<div id="wrapper"> 
    <p class="body">Line 1 
     <br> 
     <br>Line 3</p> 
    <p class="body">Line 1 
     <br>Line 2 
     <br> 
     <br> 
     <br> 
     <br>Line 6</p> 
    <p class="body">Line 1 
     <br>Line 2</p> 
</div> 

的Javascript/jQuery的

$('#wrapper p.body').each(function() { 
    var temp = $(this).innerHTML; 
    this.innerHTML = temp.replace(/(<br>)+/gim, "<br>"); 
}); 

我的目標是試圖擺脫超過2 <br>當它們發生時。但是,它似乎並不認識臨時工。這是jsfiddle的行爲,還是我做出明顯的錯誤?

+0

我不認爲有一個'一個jQuery陣列上innerHTML'財產。 – 2014-09-05 13:39:39

+1

閱讀這些文章[學習](http://juliepagano.com/blog/2014/05/18/javascript-debugging-for-beginners)[如何](http://www.creativebloq.com/javascript/) javascript-debugging-beginners-3122820)[** debug ** JavaScript](https://developers.google.com/chrome-developer-tools/docs/javascript-debugging),所以你可以幫助自己。 – 2014-09-05 13:40:15

+0

最終結果究竟是什麼?如果有超過2 *個連續*'br'節點,你想刪除'br'嗎?即它會刪除第二段中的最後兩個'br'? – 2014-09-05 13:56:58

回答

1

的jsfiddled:http://jsfiddle.net/pe6w7z1e/1/

的想法是:會有一個突破和一個/多個(一個/多個spacenewline +休息)>>只用一個破更換

下面是修改後的代碼:

$('p.body').each(function() { 
    var elem = $(this) 
    var temp = elem.html(); 
    elem.html(temp.replace(/<br>(\s+<br>)+/img, "<br>")); 

}); 

請標記爲答案,如果它回答您的問題

我認爲這是更好ŧ使用jquery的所有情況。 Jquery和原始javascript的混合是不好的概念。

+2

.replace是一個javascript方法,而不是jquery – 2014-09-05 13:52:59

+0

感謝伊沃您的意見。你能顯示任何參考嗎? jquery有什麼選擇? – masum7 2014-09-05 13:56:08

+3

*「jQuery的另一種選擇是什麼?」*沒有,因爲jQuery不是一個用於文本處理的庫。 – 2014-09-05 13:58:06

0

您需要爲innerHTML屬性使用正確的對象。這是一個DOM對象屬性,而不是一個jQuery。既可以使用所述innerHTML DOM屬性的DOM元素上:

$('p.body').each(function() { 
    var temp = this.innerHTML; 
    this.innerHTML = temp.replace(/(<br>)+/gim, "<br>"); 
}); 

的jsfiddle:http://jsfiddle.net/dm9eebz9/6/

或使用HTML()方法jQuery對象上:

$('p.body').each(function() { 
    var temp = $(this).html(); 
    this.html(temp.replace(/(<br>)+/gim, "<br>")); 
}); 

http://jsfiddle.net/dm9eebz9/7/

注意一個「正確」的換行符是<br/>,而不是<br>但我收集你不能改變

+0


不能使用,因爲我正在編輯的網頁有
,是否正確。 – 2014-09-05 13:46:02

+0

正在更新JSFiddle,但我傾銷這個答案,因爲其他答案是更簡單:) – 2014-09-05 13:46:34

1

使用.html()不是innerHTML;

正則表達式模式/(<br>\s*)+/\s*與空白字符匹配時佔用空格,該空格匹配0個或多個空格字符。

$('p.body').each(function() { 
    var temp = $(this).html(); 
    $(this).html(temp.replace(/(<br>\s*)+/gim, "<br>")); 
}); 

此外,作爲評論,use your browsers console調試,始終RTFM

小提琴:http://jsfiddle.net/dm9eebz9/4/

1

我真的不認爲正則表達式是這樣做的正確的工具。您可以使用.contents.filter組合來刪除重複的<br />標籤:

var prev = null; 
var $nodes = $('.body') 
    .contents() 
    .filter(function() { 
     return this.nodeType !== 3 || $.trim(this.data) !== ""; 
    }); 

for (var i = 1; i < $nodes.length; i++) { 
    if ($nodes.eq(i).is('br') && $nodes.eq(i-1).is('br')) { 
     $nodes.eq(i).remove(); 
    } 
} 

的複雜性在這裏是在<br />標籤,因此兩個步驟之間的文本節點。

例子:http://jsfiddle.net/dm9eebz9/9/

+0

我認爲這屬於這裏:http://codegolf.stackexchange.com/ – iambriansreed 2014-09-05 14:13:13