我需要将这个字符串<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 ="...
这样的东西,并且可以排除以 h
、 r
、e
或 f
结尾的标签(不一定是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。