Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php regex将URL与可选的';www';和协议_Php_Regex_.htaccess_Url_Model View Controller - Fatal编程技术网

Php regex将URL与可选的';www';和协议

Php regex将URL与可选的';www';和协议,php,regex,.htaccess,url,model-view-controller,Php,Regex,.htaccess,Url,Model View Controller,我想写一个regexp 一些背景信息:我正在尝试查看我的网站URL的请求URI是否包含其他URL。例如: google.com/search=xyz 然而,url并不总是包含“http”或“www”。因此,模式还应匹配字符串,如: yahoo.org/search=xyz www.yahoo.org/search=xyz msn.co.uk' ” 有很多regexp可以匹配URL,但我发现没有一个可以在http和www上进行可选匹配 我想知道匹配的模式是否可能是: ^([a-z])(co

我想写一个regexp

一些背景信息:我正在尝试查看我的网站URL的请求URI是否包含其他URL。例如:

  • google.com/search=xyz
然而,url并不总是包含“http”或“www”。因此,模式还应匹配字符串,如:

  • yahoo.org/search=xyz
  • www.yahoo.org/search=xyz
  • msn.co.uk'
有很多regexp可以匹配URL,但我发现没有一个可以在http和www上进行可选匹配

我想知道匹配的模式是否可能是:

^([a-z])(com | ca | org |等)

我想也许另一个选择是匹配任何有点(.)的字符串。(因为我的应用程序中的另一个请求URI通常不包含点)

这对任何人都有意义吗? 我真的很感谢你的帮助,因为我的项目已经被阻止了好几个星期了

多谢各位
-Tim

您可以尝试用

^(http://)?(www\)?


然后是匹配URL其余部分的规则。

要匹配可选部分,请使用问号
,请参阅

例如,为了匹配可选的
www.
,捕获域和搜索词,正则表达式可以是

(www\.)?(.+?)/search=(.+)

尽管,
+?
中的问号是一个非贪婪量词,请参见。

这是我的两分钱:

$regex = "/http:\/\/mywebsite\.com\/((http:\/\/|www\.)?[a-z]*(\.org|\.co\.uk|\.com).*)/";

但我相信你能做得更好


希望能有帮助

我建议使用一种简单的方法,基本上是在你所说的基础上,只要有点,但也要使用正斜杠。捕获所有内容而不错过不寻常的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
,其中没有正斜杠,除非它至少超过点一个字符。因此,请确保不要将该格式用于其他任何内容

$re = '/http:\/\/mywebsite\.com\/((?:http:\/\/)?[0-9A-Za-z]+(?:-+[0-9A-Za-z]+)*(?:\.[0-9A-Za-z]+(?:-+[0-9A-Za-z]+)*)+(?:\/.*)?)/';

遵守必须包围连字符的DNS规则。用https替换http?也允许https URL


根据统计,至少有1519个,而且不是常数,因此您可能希望为域提供自己的捕获组,以便可以通过在线API或列出所有捕获组的文件进行验证。

非常感谢OlafThanks的有用链接AkariAkaori。这看起来是一个很好的解决方案。我来试试看。嘿,SuperDuperApps。非常感谢你的帮助。我真的很喜欢这种方法。我很感谢你解释这一切。我想我理解语法和逻辑。这正是我需要的,而且到目前为止似乎还在工作。太好了,蒂姆,谢谢。很高兴听到它为您工作。它应该准备好与preg_match一起工作。如果你不知道如何使用preg_match,那么我相信有很多问题你可以通过复习找到答案。除非你有更具体的问题?