正则表达式有条件地去除 HTML 标记内容



我需要将这个字符串<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>的末尾 - 有人可以帮我让这个正则表达式停在那个收盘>吗?

谢谢!

通过放置w+[^href],您仍然允许像<a href ="...这样的东西,并且可以排除以 href 结尾的标签(不一定是href(。

尝试

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

说明:(?!href)是负面的前瞻性,可防止标记href

[a-zA-Z]+是您的标签。"="前后允许有空格。我仅限于字母,因为我很确定属性名称不能包含数字或下划线(w允许(。

(?:"[^"]+"|w+) 表示标签的值可以是双引号内的任何内容,也可以是一组不带引号的w+

这些都阻止了比赛进入>之外,除非您的正则表达式格式不正确并且您(例如(有<a name="asdf>(注意缺少的结束"(。

不要尝试使用正则表达式清理 HTML。 您更有可能以安全后果不佳的方式出错。

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

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

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

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

有人提到使用 DOM 获取值,我也同意如果您使用 JS,这是最佳选择。

你是在处理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。

最新更新