我知道这个问题可能会被很多人回答,但我正在尝试按照以下标准构建正则表达式 -
验证输入的网址,以包含可选的http://或https://,后跟可选的www。其次是有效域(仅包含a-z,A-Z或 - )或者是ip-address,后跟可选的port-number,后跟可选路径,没有查询参数
我需要测试URL,使其不包含XSS摄取的特殊字符,也不包含查询字符串参数。
我在Java中使用以下正则表达式模式 -
"^(http:\\/\\/|https:\\/\\/)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]{3}.?([a-z]+)?$"
答案 0 :(得分:3)
使用以下正则表达式:
^((?:http:\/\/)|(?:https:\/\/))(www.)?((?:[a-zA-Z0-9]+\.[a-z]{3})|(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?::\d+)?))([\/a-zA-Z0-9\.]*)$
答案 1 :(得分:1)
让我们分解一下:
http://
或https://
开头。所以我们需要写一个选择:它是http
或https
,后跟://
。 “要么”在组内写有|
。因此“http
或https
”变为(http|https)
。然后必须跟着://
。这个角色都不是特别的,所以我们不需要逃避它们。然后我们得到(http|https)://
。最后,所有这些都是可选的:这意味着它只能发生0或1次。这是使用?
编写的。我们得到:((http|https)://)?
。([a-zA-Z-])+
编写的。 +
表示“至少一个”,[a-zA-Z-]
表示匹配的字符类。XXX.XXX.XXX.XXX
,其中每个X
可以出现一到三次。这写成\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
(我们可以写得更好,但我保持简单)。 {1,3}
表示“一到三次”,\d
表示每个数字(与字符类[0-9]
相同)。 \.
用于转义特殊字符.
。然后,端口是:
前面的一些数字:这写为:\d+
;由于它是可选的,我们将?
包裹在其周围以到达(:\d+)?
。最后,我们有:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d+)?
。(([a-zA-Z-])+|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d+)?))
,即(validDomainExpression|IPAdressExpression)
。?
之外的任何字符。这写为[^?]
。在字符类中,?
不再是特殊字符,只是表示?
字符; ^
表示“不”,即“除了”之外的所有内容。因此,“除?
之外的所有内容”的可选序列都写为([^?]*)?
。最终正则表达式:
^((http|https)://)?(www.)?(([a-zA-Z-])+|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d+)?))([^?]*)?$
答案 2 :(得分:0)
您可以使用此在线java正则表达式测试程序来验证您的正则表达式。
我已尝试使用第一个正则表达式并且正常工作。使用第一个链接,您可以在当时测试多个输入。
提示。没有必要在java代码中使用scape符号来测试这个网站上的正则表达式。
答案 3 :(得分:0)
感谢您的宝贵回复。
我现在终于可以正确解决我的正则表达式了。
使用正则表达式:
^((http:\\/\\/)|(https:\\/\\/))?(www.)?(([a-zA-Z0-9-]+)([\\.a-zA-Z0-9-]*)|(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}))?(:\\d+)?([\\/a-zA-Z0-9\\.-]*)$
测试案例:
1. "http://net.tutsplus.com/about", result: true
2. "http://net.tutsplus.com/", result: true
3. "www.google.com", result: true
4. "https://regex101.com/", result: true
5. "http://makeit.london", result: true
6. "http://makeit.london/", result: true
7. "http://make-it.london/", result: true
8. "http://localhost:8080/demoapp/test/", result: true
9. "test.sub-domain3.sub-domain2.sub-domain1.domain-tld-0:8080/demoapp/test/mypage.html", result: true
10. "https://test.london:80/test-domain/test-path/test.html", result: true
11. "https://127.0.0.1:8080/demoapp/test-path/mypage.html", result: true
12. "https://127.0.0.1:8080/demoapp/test/mypage.html", result: true
13. "http://www.example.com/mypage.aspx", result: true
14. "http://www.192.168.2.3:231/mybranch/mypage.aspx", result: true
15. "http://example.com/somedir/somefile/", result: true
16. "https://192.213.23.12:231/branch/mypage/", result: true
17. "https://192.213.23.12:231/branch/mypage", result: true
18. "https://192.213.23.12:/branch/mypage/", result: false
19. "javascript('XSS');", result: false
20. "javascript(\"XSS\");", result: false
21. "javascript(1);", result: false
22. "http://a.b/\"onerror=\"javascript:alert(1);", result: false
23. ",", result: false
24. "https://Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac tincidunt metus. Praesent ante ligula, maximus eu quam eu, blandit auctor mi. Morbi viverra a lectus luctus tincidunt. Morbi tristique condimentum eleifend. Maecenas mattis auctor ligula, quis placerat leo luctus et. Etiam euismod massa sit amet nisl porta aliquet. Nunc commodo aliquam orci vitae feugiat. Mauris efficitur sem eget ante vestibulum vestibulum et sed ex. Quisque enim ipsum, dapibus ut interdum in, consequat at tortor. Aenean cursus tellus arcu, id placerat nisl finibus quis. Sed ullamcorper imperdiet sapien et cursus. In posuere nisl mauris.", result: false
25. "<script></script>", result: false
26. "https://192.213.23.12:231/branch/mypage/?foo=bar", result: false
27. "https://192.213.23.12:231/branch/mypage?foo=bar", result: false
28. "http://example.com/somedir/somefile/?foo1=bar1&foo2=bar2", result: false
29. "https://127.0.0.1:8080/demoapp/test/mypage.html?foo=bar", result: false
30. "http://make-it.london:8080/demoapp/test/mypage.html?foo=bar", result: false
31. "http://google.com/some/file!.html", result: false
32. "test.sub-domain3.sub-domain2.sub-domain1.domain-tld-0:8080/demoapp/test/mypage.html?foo1=bar1&foo2=bar2", result: false