【问题标题】:PHP regex match all urls [duplicate]PHP正则表达式匹配所有网址[重复]
【发布时间】:2013-05-05 02:26:17
【问题描述】:

我需要帮助创建一个匹配所有网址的正则表达式,例如,请不要将问题作为重复项关闭,因为我一直在寻找我需要的东西很长时间,而我所看到的答案都没有给出解决我的问题的答案。

网站.com

www.website.com

http://www.website.com

http://website.com

https://www.website.com

https://website.com

还有任何尾随

www.website.com/path-to-something

我正在编写一些可以缩短任何 url 的代码,但要这样做,首先我需要将它们全部匹配。

谢谢

【问题讨论】:

  • 到目前为止你的努力是什么?
  • 我已经尝试了一大堆不同的表达式,Regex 并不是我的强项... (http://[^ ]+) 这就是我现在所拥有的,但它只是匹配一种。
  • @Spudley:不要这么认为,因为website.com 不是一个有效的 URL 并且用例不同。 OP 想要搜索匹配的基本 URL。
  • @Aquillo - 其他问题的一些答案可以正常工作。但实际上,有效 URL 和 website.com 之间的唯一区别是使协议部分在正则表达式中是可选的。
  • 使用下面的正则表达式,它更通用:preg_match_all(@((((ht)|(f))tp[s]?://)|(www\.))([az] [-a-z0-9]+\.)?([az][-a-z0-9]+\.)?[az][-a-z0-9]+\.[az]+[/ ]?[a-z0-9._\/~#&=;%+?-]*@si', $input, $result);

标签: php regex


【解决方案1】:

这一项正确匹配您发布的所有内容:

preg_match_all('#[-a-zA-Z0-9@:%_\+.~\#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~\#?&//=]*)?#si', $targetString, $result);

【讨论】:

  • 请详细说明...?
  • 我得到一个错误:警告:preg_match():未知修饰符'{'我需要把它包装起来吗?
  • @LakatosGyula,您编辑的表达式将不起作用,因为字符 # 已存在于表达式中
  • 警告:这不起作用!它匹配字符串 name...like 作为 URL
  • 这也不抓取查询参数。
【解决方案2】:

你想使用这样的东西:

$string = 'www.blah.com';

$temp_string = (!preg_match('#^(ht|f)tps?://#', $string)) // check if protocol not present
    ? 'http://' . $string // temporarily add one
    : $string; // use current

if (filter_var($temp_string, FILTER_VALIDATE_URL))
{
    echo 'is valid';
} else {
    echo 'not valid';
}

这使用 PHP 的内置 URL 验证。它将首先检查是否存在协议,如果不存在,它将临时将一个添加到要检查的字符串中,然后通过验证运行它。这与当前接受的答案不同。

【讨论】:

  • 这是否匹配 gooogle.com 和 www.google.com 之类的内容?
  • 上述代码的作用是,如果它发现一个无效的 URL,即它不是以 http:// https:// ftp:// 或 ftps:// 开头的,它将临时添加 http:// 使其成为完整的 URL,然后可以安全地传递给 PHP 内置的 URL 验证功能。否则,如果它已经包含它,它将按原样传递给验证函数。
  • "googlecom" 根据 FILTER_VALIDATE_URL 有效。不确定您的用途是什么,但这不是我接受的有效网址
【解决方案3】:

您可以使用以下技巧:

$url = "your URL"
$validation = "/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i";
if((bool)preg_match($validation, $url) === false)
echo 'Not a valid URL';

我认为它可能对你有用。

【讨论】:

    【解决方案4】:

    不要使用正则表达式。有一个 PHP 函数可以做你想做的事。

    http://php.net/manual/en/function.parse-url.php

    【讨论】:

    • 问题是询问如何分解 URL 之类的东西,以便可以检查等效链接是否到达等效位置,而不是它是否有效。他要检查主机是否相同,路径是否相同等。
    • 实际上,我们确实会缩短无效的 url,我们会匹配可能是 url 的内容,例如有人要使用 google.com。从技术上讲这将是无效的,但我们只是寻找修复它,然后缩短它.... Parse url 不是我们需要的,我们已经有一个使用正则表达式的解决方案,工作方式与我们想要的完全一样,感谢您发布您的答案无论如何。
    • @Danack parse_url() : 这个函数不是为了验证给定的 URL,它只是把它分解成上面列出的部分。
    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多