Как заменить все теги 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*)/?>
0
faressoft 31 Авг 2010 в 18:02

5 ответов

Лучший ответ

Попробуй это:

str.replace(/<(\/?)[a-zA-Z]+(?:[^>"']+|"[^"]*"|'[^']*')*>/g, function($0, $1) {
    return $1 === "/" ? $0+"\n" : "\n"+$0;
})
1
Gumbo 31 Авг 2010 в 14:09
text = text.replace(/<(?!\/)/g, "\n<"); // replace every < (which are not followed by /) by \n<
-1
gawi 31 Авг 2010 в 14:15

Расширяя ответ @ Амаргоша:

Предполагая, что HTML-код, который вы пытаетесь проанализировать, более сложен, чем ваш пример (что, я думаю, так и есть), вы можете преобразовать свою HTML-страницу в XHTML. Это позволит вам использовать его как XML и делать ряд вещей, включая:

  • Используйте XSL для преобразования данных
  • Используйте обширный набор XML-библиотек .NET для извлечения и обработки данных.

В прошлом я делал это с помощью бесплатной библиотеки .NET под названием SGML.

0
Abe Miessler 31 Авг 2010 в 14:41

Только не разбирайте HTML с помощью регулярных выражений. Прочитайте это: http: //www.codinghorror .com / блог / 2009/11 / разбор - HTML -The- ктулх - way.html

В JavaScript вы можете превратить HTML в DOM, используя свойство .innerHTML, и после этого вы можете использовать другие методы 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

Вы также можете изменить это для вывода атрибутов и использовать аргумент глубины для отступа.

3
slikts 31 Авг 2010 в 14:53

Вы можете prettify 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>

4
Amarghosh 31 Авг 2010 в 14:08