Использование preg_match для обнаружения и проверки типов ссылок, встроенных в html - PullRequest
0 голосов
/ 01 января 2012

Я реализовал функцию для проверки доменов .edu.Вот как я это делаю:

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

Теперь я хочу пропустить и те URL, которые указывают на некоторые документы, такие как .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 для поиска в URL.

Примечание: match [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 ]

2 голосов
/ 01 января 2012

Интересно, почему вы все усложняете, а также заметили, что у вас есть $$ match [0] вместо $ match [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 голос
/ 01 января 2012

Я бы не использовал для этого регулярное выражение:

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);
}

Гораздо удобнее для чтения и сопровождения, чем регулярные выражения, но обратите внимание, что я оптимизировал эти вещи, а не скорость.

1 голос
/ 01 января 2012

Если я правильно понял, может помочь что-то подобное: 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'));
}
1 голос
/ 01 января 2012

Вы можете увидеть, совпадает ли расширение файла с чем-то вроде:

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

Кроме того, почему вы используете двойной знак доллара для 2-го и 3-го использования $ match [0]?

...