Совпадение двух шаблонов регулярных выражений в одном preg_match - PullRequest
1 голос
/ 24 мая 2011

Из-за ограничений в моем скрипте я столкнулся с проблемой, когда мне нужно убедиться, что строка соответствует одному из двух шаблонов регулярных выражений, при этом вызывая preg_match() только один раз.

Вот часть моего кода:

public static function get_file_host_from_link($link)
{
    foreach(Filehosts::$file_hosts as $key => $val)
    {
        if(preg_match("#{$val["regex"]}#", $link))
        {
            // We have a match, return this file host information
            return $key;
        }
    }
    // We've looped through all the file hosts and it hasn't matched,
    // return false
    return false;
}

Теперь проблема с сопоставлением URL-адресов Fileserve.com состоит в том, что может быть два типа допустимых структур URL.Один из них:

http://www.fileserve.com/file/aHd8AHD

, а другой:

http://www.fileserve.com/file/zR8VJVM/file_name.zip

В настоящее время я могу точно соответствовать первой структуре, используя это регулярное выражение: ^http://www.fileserve.com/file/[a-zA-Z0-9]+$, но мне также нужночтобы соответствовать другой структуре URL, используя что-то вроде этого: http://www.fileserve.com/[a-zA-Z0-9]+/[a-zA-Z0-9_-\.]+$.Как я могу сделать это с моим существующим кодом и вызывать preg_match() только один раз?Я думал о чем-то вроде этого:

(^http://www.fileserve.com/file/[a-zA-Z0-9]+$|http://www.fileserve.com/[a-zA-Z0-9]+/[a-zA-Z0-9_-\.]+$)

, что, насколько мне известно, означает «сопоставить первый шаблон регулярных выражений ИЛИ второй», но я понятия не имею, сработает ли это.

Спасибо!

1 Ответ

6 голосов
/ 24 мая 2011

Должно работать следующее:

^http://www.fileserve.com/file/[a-zA-Z0-9]+(/[-a-zA-Z0-9_\.]+)?$

? после всего, что в скобках, делает его необязательным.

Также обратите внимание, что класс символов [a-zA-Z0-9_-\.] недопустим, потому что - указывает диапазон, если он не является экранированным или в начале.

Вы хотите либо [-a-zA-Z0-9_\.], либо [a-zA-Z0-9_\-\.] (я использовал первое в своем ответе).

...