【问题标题】:regex to match a URL with optional 'www' and protocol正则表达式匹配带有可选“www”和协议的 URL
【发布时间】:2017-06-21 23:51:49
【问题描述】:

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

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

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

有一堆正则表达式可以匹配 url,但我没有发现对 http 和 www 进行可选匹配。

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

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

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

这对任何人都有意义吗? 我非常感谢一些帮助,因为它已经阻止了我的项目数周。

非常感谢 -蒂姆

【问题讨论】:

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


    【解决方案1】:

    我建议使用一种简单的方法,基本上以您所说的内容为基础,只要任何带有点的东西,但也可以使用正斜杠。捕获所有内容,不错过不寻常的 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,其中没有正斜杠,除非它在点之后至少有一个字符。所以请确保不要将这种格式用于其他任何事情。

    【讨论】:

    • 嘿 SuperDuperApps。非常感谢你的帮助。我真的很喜欢这种方法。我感谢你解释这一切。我想我理解语法和逻辑。正是我所需要的,并且到目前为止似乎正在工作。
    • 太棒了,蒂姆,谢谢。很高兴听到它对您有用。
    • 它应该可以使用 preg_match。如果您不知道如何使用 preg_match,那么我相信您可以查看很多问题以找出答案。除非您有更具体的问题?
    【解决方案2】:

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

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

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

    尽管.+? 中的问号是一个非贪婪量词,请参阅http://www.regular-expressions.info/repeat.html

    【讨论】:

    • 感谢 Olaf 提供的有用链接
    【解决方案3】:

    你可以尝试用

    开始你的正则表达式

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

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

    【讨论】:

      【解决方案4】:
      $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 URL。

      根据list of TLDs at Wikipedia,其中至少有 1519 个,并且不是恒定的,因此您可能希望为域提供自己的捕获组,以便可以使用在线 API 或列出所有这些的文件对其进行验证。

      【讨论】:

      • 非常感谢 AkariAkaori。这看起来是一个很好的解决方案。我试试看。
      【解决方案5】:

      这是我的两分钱:

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

      working exemple

      但我相信你可以做得更好!

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-25
        • 2016-07-26
        • 2016-06-06
        • 1970-01-01
        • 2016-01-10
        • 2012-06-15
        相关资源
        最近更新 更多