PHP正则表达式匹配所有网址[重复]

Posted

技术标签:

【中文标题】PHP正则表达式匹配所有网址[重复]【英文标题】:PHP regex match all urls [duplicate] 【发布时间】: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); 【参考方案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 之类的内容? 是 viper-7.com/Jz7nR1 和是 viper-7.com/Iv9SiS 上述代码的作用是,如果它发现一个无效的 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,它只是把它分解成上面列出的部分。

以上是关于PHP正则表达式匹配所有网址[重复]的主要内容,如果未能解决你的问题,请参考以下文章

php 求用正则匹配中文以及标点符号

php正则匹配图片路径

php中文正则匹配

php正则 匹配 手机、座机号码

图片的正则表达式匹配网址

PHP正则表达式匹配IP地址[重复]