我期盼已久的简单正则表达式为 url 的任何人都有一个很方便的效果好吗?我找不到一个使用 zend 框架验证类,已看到多个实现。

谢谢

2008-10-15 19:24:51
问题评论:

这是一个很好的资源。列出了很多不同的模式和测试︰ mathiasbynens.be/demo/url-regex

回答:

我使用这几个项目上,我并不认为我已经遇到了问题,但我相信并不详尽︰

$text = preg_replace(
  '#((https?|ftp)://(S*?.S*?))([s)[]{},;"':<]|.s|$)#i',
  "'<a href="$1" target="_blank">$3</a>$4'",
  $text
);

在结束时随机大部分是垃圾的处理类似http://domain.com. (避免匹配尾随句点) 的句中的情形。我敢肯定它无法清理,但由于其工作。我已经或多或少只被复制它从项目到项目。

这一直是 downvoted...任何人可以解释原因?

我剔除某些事情︰ 使用替换其中字符的类称为 (每个替换的匹配一个字符)。并更换不应该需要外部双引号 (需要它们时才因为 regex 毫无意义 /e 修饰符)。

虽然无法指出 google.com 不是有效的 URL,则解决方案没有为 'google.com 的简单情况。

@John Scipione: google.com是只有有效的相对 URL 路径,但不是有效的绝对 URL。我想这就是他正在寻找的内容。

大和综合资源︰ mathiasbynens.be/demo/url-regex

使用filter_var()函数来验证一个字符串为 URL 是否︰

var_dump(filter_var('example.com', FILTER_VALIDATE_URL));

它是使用正则表达式时不必要的不良做法。

编辑︰ 请注意,此解决方案不是 unicode 安全和非 XSS 安全。如果您需要复杂的验证,也许最好看其他地方。

这无疑是很好备用,遗憾的是它的 php 5.2 + (除非您安装 PECL 版本)

在 5.2.13 中,没有一个 bug (和我认为 5.3.2) 阻止将从使用此方法验证中虚线的 url。

filter_var 将拒绝测试 site.com、 我有虚线的域名,询问它们有效。我不认为 filter_var 是验证 url 的最好办法。它将允许http://www url

> 将允许的 url,如www;当 URL 如下所示,它是确定本地主机 ';

使用这种方法的另一个问题是它不是 unicode 安全。

Parse_url 应按照 PHP 手册中 — —用来验证 URL。

遗憾的是,它看起来的filter_var('example.com', FILTER_VALIDATE_URL)不会执行任何更好。

parse_url()filter_var()将传递格式错误的 Url,如http://...

因此在这种情况下的正则表达式更好的方法。

此参数不能跟在后面。如果 FILTER_VALIDATE_URL 是不是您想要更宽松,,添加一些额外的检查来处理那些边缘情况。离完成检查使您只打算自己企图对 url 的正则表达式的后尘。

见对此的所有拍摄下 regexes-不-都页的原因,例如编写自己。

请公平点 Tchalvak。对于类似的 Url 可以 (根据其他响应) 是很难做到正确的 Regexes。正则表达式并不总是的答案。相反正则表达式还也不是总是错误的答案。重要的是要选择合适的工具 (正则表达式或其他方式) 作业并不特别"抗"专业"的正则表达式。在 hindsight,结合约束其边缘的情况下,使用 filter_var 的答案看起来像更好的答案 (特别是当正则表达式的答案开始获得超过 100 个字符左右-使维护上述 regex 的痛苦)

以防您想要知道是否真正存在的 url:

function url_exist($url){//se passar a URL existe
    $c=curl_init();
    curl_setopt($c,CURLOPT_URL,$url);
    curl_setopt($c,CURLOPT_HEADER,1);//get the header
    curl_setopt($c,CURLOPT_NOBODY,1);//and *only* get the header
    curl_setopt($c,CURLOPT_RETURNTRANSFER,1);//get the response as a string from curl_exec(), rather than echoing it
    curl_setopt($c,CURLOPT_FRESH_CONNECT,1);//don't use a cached version of the url
    if(!curl_exec($c)){
        //echo $url.' inexists';
        return false;
    }else{
        //echo $url.' exists';
        return true;
    }
    //$httpcode=curl_getinfo($c,CURLINFO_HTTP_CODE);
    //return ($httpcode<400);
}

我会一如既往某种类型的$url验证之前实际验证 url 真实的因为上面的操作成本很高-可能多达 200 毫秒,具体取决于文件的大小。在某些情况下 url 可能实际上没有资源可用其位置,但 (例如,创建的图像的 url 尚未上载)。另外您不使用缓存的版本以便其不 like file_exists()将缓存文件 stat 并几乎立即返回。但仍然有用是您提供的解决方案。何不尝试使用fopen($url, 'r')?

谢谢,只我所寻找的内容。但是,我犯了一个尝试使用它。该函数是"url_exist"不是"url_exists"天哪;-)

是否有任何安全风险中直接访问用户输入的 URL?

我认为不使用正则表达式是智能的事情,在这种情况下进行。它是不可能满足所有的可能性,即使忘了,还有机会,只是不存在的 url。

以下是非常简单的方法来测试如果 url 实际上存在并且可读︰

if (preg_match("#^https?://.+#", $link) and @fopen($link,"r")) echo "OK";

(如果没有preg_match然后这会还验证您的服务器上的所有文件名)

内容来源于Stack Overflow PHP validation/regex for URL
请输入您的翻译

PHP validation/regex for URL

确认取消