我有一个包含 html 代码的字符串,如下所示:http: //jsbin.com/ocoteg/1。我想解析这个字符串,进行一些更改(例如:将所有链接更改为跨度),然后取回修改后的 html 字符串。
这是一个 jsbin,我从这里开始,但我无法让它工作:http: //jsbin.com/okireb/1/edit。
我得到了 html 字符串,我用 jquery 解析它,但我无法替换链接,并取回修改后的 html 字符串。
更新
为什么投反对票?这个问题有什么问题?
我有一个包含 html 代码的字符串,如下所示:http: //jsbin.com/ocoteg/1。我想解析这个字符串,进行一些更改(例如:将所有链接更改为跨度),然后取回修改后的 html 字符串。
这是一个 jsbin,我从这里开始,但我无法让它工作:http: //jsbin.com/okireb/1/edit。
我得到了 html 字符串,我用 jquery 解析它,但我无法替换链接,并取回修改后的 html 字符串。
更新
为什么投反对票?这个问题有什么问题?
使用 find 而不是 filter :
var dom = $('<div>'+text+'</div>');
dom.find('a').each(function() {
var el = $(this);
var html = el.html();
var span = $('<span/>').html(html);
el.replaceWith(span);
});
console.log(dom.children());
请注意,我为初始 dom 不是一个元素的情况包装了所有内容。
要将 html 作为字符串返回,请使用
var html = dom.html();
您也可以循环执行
dom.each(function(i,v){
if(v.tagName == "A"){
dom[i] = $('<span/>').html($(v).html())[0]; // replace it right away with new span element
}
});
var newString = $('<div>').append(dom.clone()).html(); //<-- to get new string http://stackoverflow.com/a/652771/1385672
console.log(newString);
编辑:
这是保留其他标签的方法
var dom = $(text.split('\n'));
$(dom).each(function(i,v){
var ele = $(v)[0];
if($(ele).is('a')){
dom[i] = $('<div>').append($('<span/>').html($(v).html())).html();
}
});
var newString = dom.get().join('\n');
这应该是你想要的(可以改进)
var text = '<!DOCTYPE html><html><head><meta charset=utf-8 /><title>JS Bin</title></head><body><a href="#">Link 1</a><a href="#">Link 2</a><a href="#">Link 3</a></body></html>';
var body_content = text.substring(text.indexOf('<body>') + 6, text.indexOf('</body>'));
var $dom = $('<div/>').html(body_content);
$('a', $dom).each(function() {
$('<span>' + $(this).html() + '</span>').insertAfter($(this));
$(this).remove();
});
var text_new = text.replace(body_content, $dom.html());
// text_new contains the entire HTML document with the links changed into spans
你可以用 .replace 来做到这一点。可能不是最好的方法。
dom = dom.replace(/<a /g,'<span');
dom = dom.replace(/<\/a>/g,'</span>');
演示:http: //jsbin.com/okireb/14/edit