validates_format_of: with => несколько регулярных выражений - PullRequest
1 голос
/ 11 декабря 2011

Я использую регулярные выражения для встраивания видео YouTube в свое приложение. Видео предоставлено пользователем, и я хочу проверить этот ввод, прежде чем он будет сохранен в базе данных. Я пытаюсь использовать те же регулярные выражения для этого, но сталкиваюсь с некоторыми проблемами. Моя предполагаемая функциональность заключается в том, чтобы проверка была истинной, если один из регулярных выражений совпадает.

validates_format_of :video_link, :with => /youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/

это то, что я думал, что будет работать, но это не так, это отрицает все, что я пока что сделал

validates_format_of :video_link, :with => /youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/

Это то, что у меня сейчас и работает (без ошибок, насколько я могу судить). Я думал, что это не сработает, потому что оба регулярных выражения должны будут соответствовать для проверки правильности, чтобы пройти. Почему это происходит? Заранее спасибо.

1 Ответ

3 голосов
/ 11 декабря 2011

Это выражение:

/youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/

соответствует первому регулярному выражению, поскольку объект регулярного выражения истинен в логическом контексте, поэтому это:

:with => /youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/

эквивалентно следующему:

:with => /youtu\.be\/([^\?]*)/

Это выражение:

/youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/

соответствует второму регулярному выражению, поэтому это:

:with => /youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/

эквивалентно этому:

:with => /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/

Я думаю, вы просто хотите объединить два регулярных выражения в одно с оператором чередования:

:with => /youtu\.be\/([^\?]*)|^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
#----------------------------^

Вы можете также рассмотреть возможность пропустить валидатор регулярного выражения в пользу или простой метод Ruby, который использует URI.parse чтобы разделить URL, тогда вы можете проверить параметры имени хоста, пути и CGI по отдельности, не пытаясь вставить все это в регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...