正则表达式有条不紊地剥离HTML标记内容

时间:2012-03-02 01:59:48

标签: javascript regex

我需要将此字符串<a class=BC_ANCHOR href="http://www.msn.com" onClick=something target=_blank>MSN</a>删除到<a href="http://www.msn.com">MSN</a> - 但此正则表达式\s+\w+[^href]=\S*\w?不会在结束时>停止,而是运行到</a>的结尾{1}} - 有人可以协助我让这个正则表达式在结束>时停止吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

通过添加\w+[^href],您仍然可以使用<a href ="...之类的内容,并且可以排除以href结尾的标记(不一定是href)。

尝试

\s+(?!href)[a-zA-Z+]+ *= *(?:"[^"]+"|\w+)

说明:(?!href)是一个负向前瞻,阻止标记成为href

[a-zA-Z]+是您的标记。在'='之前和之后允许有空格。我限制使用字母,因为我非常确定属性名称不能包含数字或下划线(\w允许)。

(?:"[^"]+"|\w+)表示标记的值可以是双引号内的任何内容,也可以是未引用的\w+集。

这些都会阻止匹配移出>,除非您的正则表达式格式错误且您有(例如)<a name="asdf>(请注意缺少结束")。

答案 1 :(得分:3)

不要尝试使用正则表达式清理HTML。你更有可能以不良的安全后果来解决问题。

可能有针对您的问题的DOM解决方案,如果没有,有些库已经过以解析器为生的人进行了彻底的测试和审核。

无耻的插件:http://code.google.com/p/google-caja/wiki/JsHtmlSanitizer

答案 2 :(得分:2)

如果你真的想使用正则表达式,我的建议是反过来做。将href和链接文本解压缩到组,然后再次生成标记。

href="([^"]+)"[^>]*>([^<]+)<\/a>

有人提到使用DOM获取值,我也同意如果你使用JS是最好的选择。

答案 3 :(得分:0)

您在处理HTML或DOM元素吗?

处理元素要容易得多。如果你想让元素只有一个href属性,那么为什么不能这样:

function fixLink(el) {
  var newLink = document.createElement('a');
  newLink.href = el.href;
  newLink.appendChild(document.createTextNode(el.textContent || el.innerText));
  el.parentNode.replaceChild(newLink, el);
}

即使您正在处理HTML,您也可以将其插入新元素(比如div),执行上述操作,然后获取剩余的innerHTML。