正则表达式匹配URL与可选的'www'和协议

时间:2017-02-04 18:35:59

标签: php regex .htaccess url model-view-controller

我正在尝试写一个正则表达式。

一些背景信息:我试着看看我网站的URL的REQUEST_URI是否包含另一个URL。像这样:

但是,网址不会始终包含“http”或“www”。所以模式也应匹配如下字符串:

有一堆正则表达式可以匹配网址,但是我找不到在http和www上进行可选匹配。

我想知道匹配的模式是否类似:

  

^([A-Z])。(COM | CA |有机|等)

)。

我想也许另一种选择可能只是匹配任何带有点(。)的字符串。 (因为我的应用程序中的其他REQUEST_URI通常不包含点)

这对任何人都有意义吗? 我真的很感激这方面的一些帮助,它已经阻止了我的项目数周。

非常感谢你 -Tim

5 个答案:

答案 0 :(得分:4)

我建议使用一种简单的方法,基本上建立在你所说的基础上,只是在其中有一个点,但也使用正斜杠。捕获所有内容,不要错过不寻常的URL。如下所示:

^((?:https?:\/\/)?[^./]+(?:\.[^./]+)+(?:\/.*)?)$

读作:

  • 可选的http://或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).*)/";

请参阅working exemple

但我相信你能做得更好!

希望它有所帮助。

答案 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或列出所有内容的文件进行验证。