Сопоставление двух шаблонов регулярных выражений в одном preg_match

#php #regex #preg-match

#php #регулярное выражение #preg-match

Вопрос:

Из-за ограничений в моем скрипте я столкнулся с проблемой, когда мне нужно убедиться, что строка соответствует одному из двух шаблонов регулярных выражений при вызове только 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;
}
  

Теперь проблема с сопоставлением Fileserve.com URL-это то, что может быть два типа допустимых структур 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:

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

 ^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_-.] (я использовал первое в своем ответе).

Комментарии:

1. Не могу поверить, что я не подумал об использовании необязательной группы … спасибо!