簡體   English   中英

有關網址驗證的快速問題

[英]a quick question about url validation

我真的不想使用curl或類似的東西。 我在尋找一種簡單的方法來檢查url(用戶將輸入該url,然后將其存儲在我的MySQL數據庫中)是否有效,並且它是有效的url,即域存在。 fopen是一個好的解決方案嗎?

任何對此的教程或技巧將不勝感激。

CURL並不那么復雜。 要獲取網址的http狀態:

$ch = curl_init('http://www.yahoo.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($status >= 200 && $status < 400) {
    // url is valid
}

正則表達式或過濾器將驗證該URL有效,但不存在。 DNS查找將驗證域是否存在,而不是URL。

首先,使用filter_var()確認它是有效的URL:

<?php

$url = "http://www.example.com/foo.php";

if(!filter_var($url, FILTER_VALIDATE_URL))
{
  die('Invalid URL');
}

接下來,使用parse_url()解析URL並確保它是HTTP(S):

$p_url = parse_url($url);
if(!$p_url) // couldn't parse URL, since parse_url() cannot recognize it
{
  die('Invalid URL');
}
if($p_url['scheme'] != 'http' && $p_url['scheme'] != 'https')
{
  die('Invalid protocol (only HTTP(S) is supported)');
}

最后,檢查主機是否存在並且可以連接到它。 我選擇在這里使用fsockopen() ,因為它會檢查主機名和端口,而實際上並不發送HTTP請求。

$fp = fsockopen($p_url['host'], (isset($p_url['port']) ? $p_url['port'] : 80));
if($fp)
{
  echo 'Valid URL';
  fclose($fp); // Remember to close the file pointer
}else{
  echo 'Invalid server';
}

請注意,您可能希望避免使用此方法(取決於您希望應用程序執行的操作),就像服務器關閉一樣,即使服務器可能存在,這也會導致Invalid server 只能從DNS服務器檢查主機名而根本不連接的替代解決方案是使用gethostbyaddr()gethostbyname()

if(@gethostbyaddr($p_url['host'])) // IP addresses passes this test
{
  echo 'Valid URL';
}else{
  $host = $p_url['host'];
  $addr = gethostbyname($host);
  if(!$addr) // Invalid domain name
  {
    echo 'Invalid domain name';
  }else if($host == $addr) // Domain name could not be resolved (i.e. does not exist)
  {
    echo 'Invalid domain name';
  }else{
    echo 'Valid URL';
  }
}

鏈接:

您應該嘗試filter_var

<?php
$url = "http://www.example.com";

if(!filter_var($url, FILTER_VALIDATE_URL))
{
  echo "URL is not valid";
}
else
{
  echo "URL is valid";
}
?> 

閱讀filter_var手冊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM