0

.edu ドメインを検証する機能を実装しました。これが私がやっている方法です:

if( preg_match('/edu/', $matches[0])==FALSE )
    return FALSE;
return TRUE;

ここで、.pdf や .doc などのドキュメントを指す URL もスキップしたいと思います。

このために、次のコードは機能するはずですが、機能しません。

if( preg_match('/edu/', $matches[0])==FALSE || preg_match('/pdf/i', $matches[0])!=FALSE || preg_match('/doc/i', $matches[0]!=FALSE))
        return FALSE;
return TRUE;

この点でどこが間違っていますか?さらに、URL文字列でチェックするドキュメントタイプのリストがあるように preg_match を実装するにはどうすればよいですか。特定の種類のドキュメントが見つかった場合は、false を返す必要があります。つまり、さまざまなドキュメント タイプのリスト (おそらく配列) を $pattern として提供し、URL で検索したいと考えています。

注: matches[0] には URL 文字列全体が含まれます。例: http://www.nust.edu.pk/Documents/pdf/NNBS_Form.pdf

関数のコード:

public function validateEduDomain($url) {
    // get host name from URL
    preg_match('@^(?:http://)?([^/]+)@i', $url, $matches);
    $host = $matches[1];

    // get last two segments of host name
    preg_match('/[^.]+\.[^.]+$/', $host, $matches);

    if( preg_match('/edu/', $matches[0])!=FALSE && (preg_match('/pdf/i', $matches[0])==FALSE || preg_match('/doc/i', $matches[0]==FALSE)))      
        return TRUE;
    return FALSE;
}
4

4 に答える 4

2

なぜそんなに複雑にしているのか、また、$matches[0] の代わりに $$matches[0] があることに気付きました。必要な正規表現は次のとおりです。

if( preg_match('/^https?:\/\/[A-Za-z]+[A-Za-z0-9\.-]+\.edu/i', $matches[0]) && !preg_match('/\.(pdf)|(doc)$/i', $matches[0]) ) {
    // do something here...
}
于 2011-12-31T23:41:12.183 に答える
1

私が正しく理解していれば、次のようなことが役に立ちます: http://ideone.com/XOEiU

function validate_path($url) {
    $url_parts = parse_url($url);
    $path_info = pathinfo($url_parts['path']);

    return preg_match('/\\.edu(?:\\.|$)/', $url_parts['host']) && in_array($path_info['extension'], array('pdf', 'doc', 'docx'));
}
于 2011-12-31T23:45:22.227 に答える
1

これには正規表現を使用しません。

function is_edu_domain($url)
{
    $parsed = parse_url($url);
    $parts = explode('.', $parsed['host']);
    return in_array('edu', $parts, TRUE);
}

これは、コメントで指定したドメインと一致します。

ファイル拡張子については、管理しやすい別の関数があります。

function is_unwanted_file_extension($url)
{
    $path = pathinfo($url);
    $extension = strtolower($path['extension']);
    $unwanted_extensions = explode(',', 'pdf,doc');
    return in_array($extension, $unwanted_extensions, TRUE);
}

次の 2 つを組み合わせることができます。

function is_url_from_edu_and_wanted($url)
{
    return is_edu_domain($url) and !is_unwanted_file_extension($url);
}

正規表現よりもはるかに読みやすく保守しやすいですが、速度ではなくこれらのことを最適化したことに注意してください。

于 2012-01-01T00:49:42.633 に答える