#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. Не могу поверить, что я не подумал об использовании необязательной группы … спасибо!