2010-08-31 25 views
0

如何更換從<anything>所有的HTML標籤\n<anything></anything><anything>\n如何更換所有HTML標籤從<anything>到 n <anything> n [使用正則表達式(JavaScript的)

var text = "<anything>welcome</anything><anything>Hello</anything>"; 

結果

var text = "\n<anything>welcome</anything>\n\n<anything>Hello</anything>\n"; 

此代碼將幫助你(匹配所有標籤)

</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)/?> 
+1

你想要發生什麼自閉標籤? – 2010-08-31 14:04:09

+4

爲什麼不能遍歷DOM樹並添加那些'\ n'?正則表達式不是一個很好的工具。 – NullUserException 2010-08-31 14:04:42

+0

@faressoft:你的第一個結果還包括一個空行,但你的第二個結果不包含。你要哪個? – 2010-08-31 14:05:42

回答

1

試試這個:

str.replace(/<(\/?)[a-zA-Z]+(?:[^>"']+|"[^"]*"|'[^']*')*>/g, function($0, $1) { 
    return $1 === "/" ? $0+"\n" : "\n"+$0; 
}) 
+0

此代碼幫助我在我的項目中,謝謝 – faressoft 2010-08-31 14:50:55

3

只是不使用正則表達式解析HTML。閱讀:http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

在JavaScript中,您可以使用.innerHTML屬性將HTML轉換爲DOM,之後您可以使用其他DOM方法遍歷它。

簡單的例子(需要螢火蟲):

var div = document.createElement('div'); 
var html = '<p>foo <span>bar</span><br /></p>'; 
div.innerHTML = html; 

function scan(node, depth) 
{ 
    depth = depth || 0; 
    var is_tag = node.nodeType == 1; 
    var self_contained = false; 
    if (is_tag) { 
     self_contained = node.childNodes.length == 0; 
     var tag_name = node.tagName.toLowerCase(); 
     console.log('<' + tag_name + (self_contained ? ' /' : '') + '>', depth); 
    } else { 
     console.log(node.data); 
    } 
    for (var i = 0, n = node.childNodes.length; i < n; i++) { 
     scan(node.childNodes[i], depth + 1); 
    } 
    if (!self_contained && is_tag) { 
     console.log('</' + tag_name + '>', depth); 
    } 
} 

scan(div); 

輸出:

<div> 0 
<p> 1 
foo 
<span> 2 
bar 
</span> 2 
<br /> 2 
</p> 1 
</div> 0 

你也可以修改這個輸出屬性和使用深度參數縮進。

+0

打敗我吧。我不一定同意這篇文章,但每個人都應該閱讀它。 – Rushyo 2010-08-31 14:10:12

+3

'innerHTML'不是一種方法,而是一種屬性。 – Gumbo 2010-08-31 14:13:44

+1

對,謝謝。我一直在使用jQuery的'.html()'這麼久,我忘記了。 – slikts 2010-08-31 14:14:46

4

可以美化XML沒有正則表達式:

var text = "<anything>welcome</anything><anything>Hello</anything>"; 
var xml = new XML("<root>" + text + "</root>"); 
console.log(xml.children().toXMLString()); 

輸出:

<anything>welcome</anything>
<anything>Hello</anything>

+0

如何獲得輸出? – faressoft 2010-08-31 14:12:00

+1

@faressoft'var text1 = xml.children()。toXMLString();' – Amarghosh 2010-08-31 14:12:55

+2

+1整齊的方法。 E4X的可用性很少。 – Anurag 2010-08-31 14:13:32

-1
text = text.replace(/<(?!\/)/g, "\n<"); // replace every < (which are not followed by /) by \n< 
0

擴大對@ Amarghosh的回答是:

假設你正在試圖解析HTML比你的例子更復雜(我猜它是)你可能要你的HTML頁面轉換成XHTML。這將允許你使用它當作XML,並做了一些事情,包括:

  • 使用XSL轉換數據
  • 使用.NET的擴展集XML 庫的提取和處理數據。

我已經在過去用一個名爲SGML的免費.NET庫完成了這項工作。

相關問題