繁体   English   中英

如何替换来自的所有html标签 <anything> 到\\ n <anything> \\ n [使用正则表达式(JavaScript)]

[英]How to replace all html tags from <anything> to \n<anything>\n [using regexp (JavaScript)]

如何将所有HTML标记从<anything>替换为\\n<anything></anything>替换为<anything>\\n

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*)/?>

您可以在不使用正则表达式的情况下美化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>

只是不要使用正则表达式解析HTML。 阅读此: http : //www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

在JavaScript中,您可以使用.innerHTML属性将HTML转换为DOM,然后再使用其他DOM方法来遍历它。

简单示例(需要Firebug):

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

您也可以修改它以输出属性,并使用depth参数进行缩进。

尝试这个:

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

扩展@Amarghosh的答案:

假设您要解析的HTML比示例(我想是)要复杂得多,那么您可能希望将HTML页面转换为XHTML。 这将使您可以将其视为XML并执行许多操作,包括:

  • 使用XSL转换数据
  • 使用.NET广泛的XML库集来提取和处理数据。

我过去使用一个名为SGML的免费.NET库来完成此操作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM