2012-03-02 76 views
2

我需要这个字符串<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>结束 - 有人可以帮助我得到这个正则表达式停止在关闭>正则表达式剥离HTML标签内容有条件

谢谢!

+2

该正则表达式在许多方面看起来不正确,例如'[^ href]'意思是“匹配除了h,r,e或f之外的任何其他任何东西的_single_字符”。代码将运行的上下文是什么? (因为如果你正在提取网页上的元素,那么有更多的方法去解决它。) – nnnnnn 2012-03-02 02:04:36

+0

'[^ href]'表示除了'h','r','e'或'f'之外的任何字符。它并不意味着不是'href'。这可能会像'((?!href \ b)[az] +)' – 2012-03-02 02:07:59

+1

您可能需要[更漂亮的模式](http://stackoverflow.com/questions/4231382/regular-expression-pattern-not -matching任何地方,在串/ 4234491#4234491)。 – tchrist 2012-03-02 02:12:10

回答

3

通过将\w+[^href]你仍然允许之类的东西<a href ="...,可以排除hre,或f结束标记(即不一定href)。

尝试

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

说明:(?!href)是负先行并防止标签被href

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

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

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

+0

很好的解释。我会投两次如果我可以:) – 2012-03-02 02:13:37

+0

这是工作真棒 - 除了我刚刚发现的一个场景。有一个链接看起来像'MSN',出于某种原因'(事件)'没有得到匹配。我试着将'\ w +'改成'。*',但是选择了所有的东西。正则表达式,你为什么恨我? – 2012-03-02 02:20:04

+2

正则表达式不恨你,你只需要学习贪婪和非贪婪。 '。*'尽可能匹配(所以会一直到最后一个'>')。为了使这种非贪婪,即尽可能匹配*小*,请尝试'。*?'。或者,您可以执行'[\ w()] +'来允许'\ w'和括号。 (请记住,'\ w'是'[a-zA-Z0-9_]'(粗略地说,不确定区域设置和重音字母)。 – 2012-03-02 02:41:59

2

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

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

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

+0

由于某种原因,Regex选择了整个字符串 - 当我需要做的是将所有'A'标签除了'href'并且呈现该字符串。 – 2012-03-02 02:08:12

3

不要试图使用正则表达式来消毒HTML。安全后果较差的方式可能会导致错误发生。

您的问题可能存在DOM解决方案,如果没有,那么有些库已经由编写解析器为生的人进行了全面测试和审查。

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

+0

+1显然,下来的选民没有足够的理由说出他们的答案是好建议 – RobG 2012-03-02 02:16:17

+0

你为什么要用JS消毒HTML?为什么不如果需要的话,你需要做服务器端吗? – mpen 2012-03-02 03:11:38

+1

@Mark,如果你从web服务调用中获得HTML,但不信任该服务在你的域中运行代码,那么你必须自己清理它,你可以避免延迟 – 2012-03-02 04:39:37

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。

+0

我想探讨一下,我解析了评论栏的链接,评论最初是以HTML格式显示给用户的,但是当用户想要编辑评论时,我需要将其转换去文字并去掉一些装饰我添加特定于应用程序。考虑到这一点,有没有更好的方式来与DOM做到这一点呢? – 2012-03-02 18:41:32