regex
2013-07-04 41 views 0 likes 
0

我有这个正则表达式:/href=('|")(\w+|\/dashboard)/匹配每个HTML锚点,其href以/dashboardsomething/without/a/slash/at/the/beginning开头。修改正则表达式来过滤包含特定字符串的输入

所以这个正则表达式匹配:

<a href="/dashboard/security-settings"></a> 
<a href='dashboard/security-settings'></a> 
<a href='something/security-settings'></a> 

但不是:

<a href="/home"></a> 
<a href="/about"></a> 

这里的问题是,它也符合:

<a href="http://www.google.com"></a> 
<a href="www.facebook.com"></a> 

如何过滤HREF的开始httpwww从正则表达式?我试着玩了^运营商没有运气:

href=('|")(([^http][^www]|\w+)|\/dashboard) 
+0

哪种语言?...为什么使用正则表达式?使用html解析器 – Anirudha

回答

1

^一个character class作品的单个字母,而不是字符串内。所以[^http]实际上是指“匹配一个既不是h也不是t也不是p”的字符。

你需要一个negative lookahead assertion代替:

href=(['"])(?!http|www)(\w+|/dashboard) 
0

最简单的解决方法是:

/^href=['"](\w+|\/dashboard)/ 

^操作(如果在正则表达式的开始时使用),可确保正则表达式只匹配在行的开头,所以它只匹配以href开头的字符串。

正如其他人所提到的,您可以使用负向预测来显式筛选以httpwww开头的字符串。但是,如果字符串将以ftp://(或“http”或“www”以外的任何前缀)开头,则它仍然会使用“http”和“www”的负向查找进行匹配。在这种情况下使用白名单似乎更好,而不是包含你不想匹配的所有内容的黑名单。

相关问题