我想从一个html文档中提取文本,保持其中的链接.例如:
从这个HTML代码
<div class="CssClass21">bla1 bla1 bla1 <a href="http://www.ibrii.com">go to ibrii</a> bla2 bla2 bla2 <img src="http://www.contoso.com/hello.jpg"> <span class="cssClass34">hello hello</span>
我想提取这个
bla1 bla1 bla1 <a href="http://www.ibrii.com">go to ibrii</a> bla2 bla2 bla2 hello hello
在StackOverflow的另一篇文章中,我找到了RegEx< [^>] *>它允许通过替换每个匹配来提取文本.如何从匹配中排除锚标记?似乎RegEx不允许反向匹配.
暂时编码< a href ...> …< / a>进入别的东西,删除所有其他标签然后恢复< a>标签:
// Example in javascript: string. replace(/<a(.*?)>/g,'\0$1\0'). replace(/<\/a>/,'\1'). replace(/<[^>]*>/,''). replace(/\0(.*?)\0/,'<a$1>'). replace(/\1/,'</a>');
在上面的代码中,我使用NUL和SOH字符(ASCII 0x00和0x01)作为< a>的替换.标签只是因为它们不太可能出现在字符串中.您可以随意将其替换为字符串中不会出现的任何其他字符或字符序列.
从其他评论看来,您正在浏览器中运行.在这种情况下,浏览器已经将HTML解析为一个漂亮的DOM树.使用DOM方法解析树并按照您希望的方式处理它:
function simpleHTML (domNode) { var ret = ""; if (domNode.nodeType === Node.ELEMENT_NODE) { var children = domNode.childNodes; for (var i=0;i<children.length;i++) { var child = children[i]; // Filter out unwanted nodes to speed up processing. // For example,you can ignore 'SCRIPT' nodes etc. if (child.nodeName != 'SCRIPT') { if (child.nodeName == 'A') { ret += '<a href="' + child.href + '">' + simpleHTML(child) + '</a>'; } else { ret += simpleHTML(child); } } } } else if (domNode.nodeType === Node.TEXT_NODE) { ret += domNode.nodeValue; } return ret; } // serialize the whole document: var simpleDocument = simpleHTML(document.body); // serialize a div: var simpleDiv = simpleHTML(document.getElementById('some_div')); // filter a html formatted string: var temp = document.createElement('DIV'); temp.innerHTML = original_string; simple_string = simpleHTML(temp);