我有这个正则表达式:/href=('|")(\w+|\/dashboard)/
匹配每个HTML锚点,其href以/dashboard
或something/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>
如何从正则表达式中的http
或www
开始过滤href?我尝试使用^
运算符而没有运气:
href=('|")(([^http][^www]|\w+)|\/dashboard)
答案 0 :(得分:1)
^
适用于单个字母,而不是字符串。因此[^http]
实际上意味着“匹配一个既不是h
也不是t
也不是p
”的角色。
您需要negative lookahead assertion代替:
href=(['"])(?!http|www)(\w+|/dashboard)
答案 1 :(得分:0)
最简单的解决方案是:
/^href=['"](\w+|\/dashboard)/
^
运算符(如果在正则表达式的开头使用)确保正则表达式仅在行的开头匹配,因此它只匹配以href
开头的字符串。 / p>
正如其他人所说,您可以使用否定前瞻来明确过滤掉以http
或www
开头的字符串。但是,如果字符串以ftp://
(或“http”或“www”以外的任何前缀)开头,则仍然可以使用“http”和“www”的否定前瞻匹配。在这种情况下使用白名单似乎更好,而不是包含您不想匹配的所有内容的黑名单。