修改正则表达式以过滤包含特定字符串的输入

时间:2013-07-04 13:17:45

标签: regex

我有这个正则表达式:/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>

如何从正则表达式中的httpwww开始过滤href?我尝试使用^运算符而没有运气:

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

2 个答案:

答案 0 :(得分:1)

character class中的{p> ^适用于单个字母,而不是字符串。因此[^http]实际上意味着“匹配一个既不是h也不是t也不是p”的角色。

您需要negative lookahead assertion代替:

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

答案 1 :(得分:0)

最简单的解决方案是:

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

^运算符(如果在正则表达式的开头使用)确保正则表达式仅在行的开头匹配,因此它只匹配以href开头的字符串。 / p>

正如其他人所说,您可以使用否定前瞻来明确过滤掉以httpwww开头的字符串。但是,如果字符串以ftp://(或“http”或“www”以外的任何前缀)开头,则仍然可以使用“http”和“www”的否定前瞻匹配。在这种情况下使用白名单似乎更好,而不是包含您不想匹配的所有内容的黑名单。