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;

我在这方面哪里错了?此外,我将如何实现 preg_match 以使其具有要检查 url 字符串的文档类型列表。如果找到某种类型的文档,它应该返回 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

您可以查看文件扩展名是否与以下内容匹配:

 preg_match('/\.php$/i', $string);  

另外,你为什么在 $matches[0] 的第 2 次和第 3 次使用中使用双美元符号?

于 2011-12-31T23:33:07.170 回答
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);
}

您可以将两者结合起来:

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 回答