1

テキストエリアを介して送信されたURLを検証する簡単な関数を作成しました(1行に1つのリンク)。

function validate_urls($value)
{
    //final array of links
    $links = array();

    $value = array_map(function($a) use (&$links){
        $a = trim($a);
        if(strlen($a) !== 0 and (strpos($a, 'http') !== 0 or strpos($a, 'https') !== 0)){
            $a = 'http://'.$a;
        }
        $url = parse_url($a,PHP_URL_HOST);
        if($url != null and !in_array($a, $links) and filter_var($a, FILTER_VALIDATE_URL) !== false and checkdnsrr($a)){
            $links[] = $a;
        }
        return false;
    }, explode("\n",$value));
    return $links;
}

var_dump(validate_urls($_POST['links']);

これが行うことは、

  • URLは有効です
  • URLはアクティブです
  • URLは重複していません

問題は、なぜそれが機能しない(空の配列を返す)のですか?すべてのチェックをチェックしましたが、機能するはずですが、機能しません。コードが乱雑な場合は申し訳ありませんが、私はまだ学習しようとしています。

4

1 に答える 1

1
if(strlen($a) !== 0 and (strpos($a, 'http') !== 0 or strpos($a, 'https') !== 0)){

A and B or C(A and B) or (A and C)AND は OR よりも優先順位が高いため、 NOT に変換されます。したがって、それを に変更しA and (B or C)ます。


FILTER_VALIDATE_URLのドキュメントには、「この関数は有効な ASCII URL のみを検出することに注意してください;」と記載されています。したがって、これはかなり制限的なオプションです。RFC 3986によって置き換えられたRFC 2396で指定された URL の仕様に準拠しています。

このフィルターをもっと徹底的に調べなくても、これら 2 つの情報は (私にとって) そのフィルターがまったく役に立たないものであると判断するのに十分です。


checkdnsrr($a)

ホストだけでなく URL 全体をテストしています。ホストをチェックする場合でも、MX レコードを探すことになります (つまり、そのホストにメールでアクセスできるかどうか)。Aそのホストに IP が設定されているかどうかをCNAME確認したり、ホストが別の DNS レコードのエイリアスであるかどうかを確認したり…. NSおそらく、そのホストが DNS レコードを持っているかどうかを確認するものを探しているでしょう。

したがって、チェックを に変更するcheckdnsrr($url, "NS")と、その URL のホスト コンポーネントが実際に DNS に認識されているかどうかを検証することになります。そのホストが指定されたポートで実際にリッスンしているかどうかを確認していません。また、指定されたリソース (/foo/bar.html など) が存在するかどうかを確認していません。


URL が実際に有用なものを指していることを確認したい場合は、HEADリクエストを作成してレスポンスを確認する必要があります。curlを使えば簡単にできます。curl が利用できない場合は、fsockopen()を使用して単純な HTTP クライアントを自分で実装できます。ただし、HTTP (SSL を介した HTTP) を話すことができず、リダイレクト後のリダイレクトや類似のものを自分で実装する必要があります。要するに、あなたはその道を行きたくない.

とはいえ、この先にはパフォーマンスの問題もあります。HTTP 要求は同期的に行われます。ホストが許容時間内に応答しない場合、スクリプトがタイムアウトする可能性があります。または、チェックしている URL の数とそれらの背後にあるサービスの品質によっては、スクリプトが終了するまでに少なくとも時間がかかる場合があります。

于 2012-07-06T11:11:14.977 に答える