找到所有链接并用它们的href值替换它们

时间:2017-01-21 10:40:51

标签: javascript regex

我想我有一个字符串:

dynamic dynObj = JsonConvert.DeserializeObject(html);

我需要输出

<a href="site/project/109#" target="_blank">href</a> text, text, <a href="/target" class="test">test</a>

我可以找到所有链接

 site/project/109# text, text, test

并在循环中进行替换。但是我想缩短代码,通过单个替换来做所有事情,如下所示:

var txt = msg.match(/\<a\shref=\"(.*)\"\s(.*)[\<\/a\>]/gmi);

但在这种情况下,我得到: [object HTMLHeadElement]

2 个答案:

答案 0 :(得分:2)

永远不要使用正则表达式来解析HTML,最好使用内容生成一个元素,然后在元素上执行其余操作。

var str = '<a href="site/project/109#" target="_blank">href</a> text, text, <a href="/target" class="test">test</a>';

// create an element
var temp = document.createElement('div');

// set the content with the string
temp.innerHTML = str;

// get all `a` tags and convert into array
// for older browser use `[].slice.call() 
// for converting into array
Array.from(temp.querySelectorAll('a')).forEach(function(ele) {
  // create a text node with the attribute value 
  var text = document.createTextNode(ele.getAttribute('href'));
  // replace a tag wit the text node
  ele.replaceWith(text);
});

// get the updated html content
console.log(temp.innerHTML)

为什么不使用正则表达式? :RegEx match open tags except XHTML self-contained tags

更新: msg变量是一个元素对象,而不是字符串,这就是它被转换为[object HTMLHeadElement]的原因(HTMLHeadElement是指{{1}标签,我认为你的核心检查也有问题)。与上面相同,将HEAD替换为temp。如果您想保留原始元素内容,请按上述方式生成msg元素,并将内容设置为temp

答案 1 :(得分:0)

如果您正在使用jQuery(这很好并且做所有事情)那么您可以很容易地获得href:

var string = '<a href="site/project/109#" target="_blank">href</a> text, text, <a href="/target" class="test">test</a>';
var href = $(string).attr('href');

这意味着设置锚标记的文本很简单:

$(string).text($(string).href));