【问题标题】:PHP URL validationPHP URL 验证
【发布时间】:2012-05-13 05:00:13
【问题描述】:

我知道有无数个线程在问这个问题,但我找不到可以帮助我解决这个问题的线程。

我基本上是在尝试解析大约 10,000,000 个 URL 的列表,确保它们按照以下标准有效,然后获取根域 URL。这个列表几乎包含了你能想象到的所有东西,包括(和预期的格式化 url)之类的东西:

biy.ly/test [VALID] [return - bit.ly]
example.com/apples?test=1&id=4 [VALID] [return - example.com]
host101.wow404.apples.test.com/cert/blah [VALID] [return - test.com]
101.121.44.xxx [**inVALID**] [return false]
localhost/noway [**inVALID**] [return false]
www.awesome.com [VALID] [return - awesome.com]
i am so awesome [**inVALID**] [return false]
http://404.mynewsite.com/visits/page/view/1/ [VALID] [return - mynewsite.com]
www1.151.com/searchresults [VALID] [return - 151.com]

有人对此有什么建议吗?

【问题讨论】:

  • 您并没有真正使用给定的标准验证任何内容。您是否还想进行 WHOIS 查询以查看该域是否实际存在?
  • 你到底要干什么? localhost 一个有效的 URL。 someverylongdomainnamethatprobablydoesntexist.com 也是,但可能不存在。
  • @yAnTar:cmets 中链接的语法是 [link text](URL)
  • “我找不到能帮我解决这个问题的人。” - 你还不够努力。

标签: php regex


【解决方案1】:
^(?:https?://)?(?:[a-z0-9-]+\.)*((?:[a-z0-9-]+\.)[a-z]+)

解释

^                # start-of-line
(?:              # begin non-capturing group
  https?         #   "http" or "https"
  ://            #   "://"
)?               # end non-capturing group, make optional
(?:              # start non-capturing group
  [a-z0-9-]+\.   #   a name part (numbers, ASCII letters, dashes) & a dot
)*               # end non-capturing group, match as often as possible
(                # begin group 1 (this will be the domain name)
  (?:            #   start non-capturing group
    [a-z0-9-]+\. #     a name part, same as above
  )              #   end non-capturing group
  [a-z]+         #   the TLD
)                # end group 1 

http://rubular.com/r/g6s9bQpNnC

【讨论】:

【解决方案2】:

我会从默认开始:

filter_var($inputUrl, FILTER_VALIDATE_URL);

然后添加您不接受进一步验证的特殊情况。这应该会简化一点。

至于获取宿主。

parse_url($inputUrl, PHP_URL_HOST);

【讨论】:

  • @RohitChopra 这绝对不是真的。 FILTER_VALIDATE_URL 根据 RFC 2396 规范验证有效 URL。 faqs.org/rfcs/rfc2396.html
  • 这个验证器还有两个可选标志,FILTER_FLAG_PATH_REQUIRED 和 FILTER_FLAG_QUERY_REQUIRED。
【解决方案3】:

^(([a-zA-Z](\.[a-zA-Z])+)|([0-9]{1,3}(\.[0-9]{1,3}){3})/.*$

编辑

在 php 中是 preg_match ( '^(([a-zA-Z](\.[a-zA-Z])+)|([0-9]{1,3}(\.[0-9]{1,3}){3})/.*$' , $myUrls , $matches)

你需要的是$matches[1]

【讨论】:

  • 域名可能包含其他字符,而不仅仅是拉丁符号。即使问题中提到了www1.151.com,这个正则表达式也会失败
【解决方案4】:
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$w$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
  {
  $websiteErr = "Invalid URL";
  }ebsite))
  {
  $websiteErr = "Invalid URL";
  }

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多