我正在尝试写一个正则表达式。
一些背景信息:我试着看看我网站的URL的REQUEST_URI是否包含另一个URL。像这样:
但是,网址不会始终包含“http”或“www”。所以模式也应匹配如下字符串:
有一堆正则表达式可以匹配网址,但是我找不到在http和www上进行可选匹配。
我想知道匹配的模式是否类似:
^([A-Z])。(COM | CA |有机|等)
()。
我想也许另一种选择可能只是匹配任何带有点(。)的字符串。 (因为我的应用程序中的其他REQUEST_URI通常不包含点)
这对任何人都有意义吗? 我真的很感激这方面的一些帮助,它已经阻止了我的项目数周。
非常感谢你 -Tim
答案 0 :(得分:4)
我建议使用一种简单的方法,基本上建立在你所说的基础上,只是在其中有一个点,但也使用正斜杠。捕获所有内容,不要错过不寻常的URL。如下所示:
^((?:https?:\/\/)?[^./]+(?:\.[^./]+)+(?:\/.*)?)$
读作:
将整个事物捕获到第一组。
它会匹配,例如:
nic.uk
nic.uk/
http://nic.uk
http://nic.uk/
https://example.com/test/?a=bcd
验证它们是有效的URL是另一回事!它也会匹配:
index.php
不匹配:
directory/index.php
最小匹配基本上是something.something
,没有正斜杠,除非它至少有一个字符超过点。所以请确保不要将该格式用于其他任何内容。
答案 1 :(得分:3)
要匹配可选部分,请使用问号?
,请参阅Optional Items。
例如,要匹配可选的www.
,捕获域和搜索词,正则表达式可以是
(www\.)?(.+?)/search=(.+)
虽然.+?
中的问号是非贪婪的量词,但请参阅http://www.regular-expressions.info/repeat.html。
答案 2 :(得分:1)
您可以尝试使用
启动正则表达式 ^(http://)?(www\.)?
然后是匹配其余网址的规则。
答案 3 :(得分:1)
这是我的两分钱:
$regex = "/http:\/\/mywebsite\.com\/((http:\/\/|www\.)?[a-z]*(\.org|\.co\.uk|\.com).*)/";
但我相信你能做得更好!
希望它有所帮助。
答案 4 :(得分:1)
$re = '/http:\/\/mywebsite\.com\/((?:http:\/\/)?[0-9A-Za-z]+(?:-+[0-9A-Za-z]+)*(?:\.[0-9A-Za-z]+(?:-+[0-9A-Za-z]+)*)+(?:\/.*)?)/';
https://regex101.com/r/x6vUvp/1
遵守必须包围连字符的DNS规则。用https替换http?也允许https网址。
根据list of TLDs at Wikipedia,其中至少有1519个,并且它不是常数,因此您可能希望为域提供自己的捕获组,以便可以使用在线API或列出所有内容的文件进行验证。