Регулярное выражение хранится в переменной не работает при сопоставлении - PullRequest
1 голос
/ 18 марта 2020

У меня есть ha sh "разрешенных ссылок" для рендеринга на моем рельсе, что-то вроде этого

    ALLOWED_URLS = {
      "vimeo": {
          :regex => "/https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)/",
},
      "youtube": {
          :regex => "/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/",
    }

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

Но когда я передаю эту переменную в CoffeeScript и преобразовываю ее в JSON, регулярное выражение не работает, потому что он поставляется с кавычками, например:

"/https?://(?:www.|player.)?vimeo.com/(?:channels/(?:w+/)?|groups/([^/]*)/videos/|album/(d+)/video/|video/|)(d+)(?:$|/|?)/"

, и когда я пытаюсь проверить его, отображается эта ошибка ...

Uncaught SyntaxError: Недопустимое регулярное выражение: / /https?://(?:www.|player.)?vimeo.com/(?:channels/(?:w+/)?|groups/([^/]*)/videos/|album/(d+ ) / video / | video / |) (d +) (?: $ | / |?) //: нечего повторять на String.mat c

Я пытался поставить регулярное выражение без кавычек на сервере, но результат тот же

Что я могу сделать ??

1 Ответ

2 голосов
/ 18 марта 2020

Здесь есть две отдельные проблемы:

  1. Выход будет кошмаром, потому что каждый (Ruby, (Java | Coffee) Script, regexes) хочет использовать \ как escape-символ.
  2. Преобразование строки Dynami c в регулярное выражение (Java | Coffee) Script.

Часть (2) довольно проста, получить регулярное выражение в JavaScript string и затем используйте конструктор RegExp в вашем JavaScript:

# In your CoffeeScript...
str = '^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*'
re  = new RegExp(str)

Так что теперь вам нужно получить эту строку в вашем CoffeeScript:

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

Создать строку в Ruby (используя одинарные кавычки, чтобы уменьшить число выходов и не включать начальную и конечную косую черту):

youtube: {
  regex: '^.*(youtu.be/|v/|u/\w/|embed/|watch\?v=|&v=)([^#&?]*).*'
}

, а затем вы можете использовать to_json, чтобы войти в JavaScript:

<script type="text/javascript">
  let str = <%= ALLOWED_URLS[:youtube][:regex].to_json %>;
  let re  = new RegExp(str);
</script>

Это будет эквивалентно высказыванию:

let re = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;

в JavaScript.

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