我需要将此字符串<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}} - 有人可以协助我让这个正则表达式在结束>
时停止吗?
谢谢!
答案 0 :(得分:3)
通过添加\w+[^href]
,您仍然可以使用<a href ="...
之类的内容,并且可以排除以h
,r
,e
或f
结尾的标记(不一定是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。