使用preg_match发现并验证嵌入在html中的链接类型

时间:2011-12-31 23:18:07

标签: php regex preg-match strpos

我已经实现了验证.edu域的功能。我就是这样做的:

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

现在我想跳过那些指向某些文档的网址,例如.pdf和.doc。

为此,以下代码应该有效但不是:

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在网址中查找。

  

注意:   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 个答案:

答案 0 :(得分:2)

我想知道你为什么要把一切变得如此复杂,并且还注意到你有$$匹配[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...
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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'));
}

答案 3 :(得分: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);
}

比正则表达式更具可读性和可维护性,但请注意我已经针对这些事情进行了优化而不是速度。