在PHP中验证URL

Oli*_*sen 25 php url

可能重复:
URL的PHP​​验证/正则表达式

是否有任何简单,安全和快速的方法来检查URL是否在PHP中有效?

Dan*_*man 58

就在这里!用途filter_var:

if (filter_var($url, FILTER_VALIDATE_URL) !== false) ...
Run Code Online (Sandbox Code Playgroud)

FILTER_VALIDATE_URL根据RFC 2396验证URL .

  • FILTER_VALIDATE_URL不可靠,无法根据IPv6地址验证URL.我偶然发现了这一点,同时搜索任何关于不使用它的PHP URL验证的问题,因为我发现它几乎没用. (18认同)
  • 这被解释为一个有效的URL,正确显示cookie:`echo filter_var('http://example.com/"> <script> alert(document.cookie)</ script>',FILTER_VALIDATE_URL);`请注意`filter中的`filter_var();` (4认同)
  • 你为什么用`(filter_var($ url,FILTER_VALIDATE_URL)!== false)`而不是`(filter_var($ url,FILTER_VALIDATE_URL))`? (3认同)

Dev*_*n M 15

好吧,如果我们查看RFC 3986,我们可以找到URL的定义.

如果我们看一下附录B,就会有一个使用正则表达式来解析URL的指南:

附录B.使用正则表达式解析URI引用

由于"first-match-wins"算法与
POSIX正则表达式使用的"贪婪" 消歧方法相同,因此
使用正则表达式解析
URI引用的潜在五个组件是很自然和平常的.

以下行是用于将
格式正确的URI引用分解为其组件的正则表达式.

  ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
   12            3  4          5       6  7        8 9
Run Code Online (Sandbox Code Playgroud)

上面第二行中的数字只是为了提高可读性; 它们表示每个子表达的参考点(即每个配对括号).我们将子表达式匹配的值称为$.例如,将上面的表达式与之匹配

  http://www.ics.uci.edu/pub/ietf/uri/#Related
Run Code Online (Sandbox Code Playgroud)

导致以下子表达式匹配:

  $1 = http:
  $2 = http
  $3 = //www.ics.uci.edu
  $4 = www.ics.uci.edu
  $5 = /pub/ietf/uri/
  $6 = <undefined>
  $7 = <undefined>
  $8 = #Related
  $9 = Related
Run Code Online (Sandbox Code Playgroud)

where表示该组件不存在,如上例中的查询组件的情况.因此,我们可以确定五个组件的值

  scheme    = $2
  authority = $4
  path      = $5
  query     = $7
  fragment  = $9
Run Code Online (Sandbox Code Playgroud)

在相反的方向,我们可以使用第5.3节的算法从其组件重新创建URI引用.

您可以使用此正则表达式手动解析URL或使用PHP 4和5中可用的内置parse_url函数