javascript - 存储在变量中的正则表达式在匹配时不起作用

标签 javascript jquery ruby-on-rails regex ruby

我有一个“允许的链接”的哈希值可以在我的 Rails 后端上呈现,就像这样

    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 以及视频 ID,我已经尝试过它们,并且它们工作得很好。

但是当我将该变量传递给 CoffeeScript 并将其转换为 JSON 时,正则表达式不起作用,因为它带有引号,如下所示:

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

当我尝试测试它时,会显示此错误...

Uncaught SyntaxError: Invalid regular expression: //https?://(?:www.|player.)?vimeo.com/(?:channels/(?:w+/)?|groups/([^/]*)/videos/|album/(d+)/video/|video/|)(d+)(?:$|/|?)//: Nothing to repeat at String.matc

我尝试将不带引号的正则表达式放在后端,但结果是相同的

我能做什么?

最佳答案

这里有两个独立的问题:

  1. 转义将是一场噩梦,因为每个人(Ruby、(Java|Coffee)Script、正则表达式)都想使用 \ 作为转义字符。
  2. 将动态字符串转换为 (Java|Coffee)Script 正则表达式。

第 (2) 部分非常简单,将正则表达式放入 JavaScript 字符串中,然后在 JavaScript 中使用 RegExp 构造函数:

# 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 中。

关于javascript - 存储在变量中的正则表达式在匹配时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60731312/

相关文章:

javascript - ajax后重新构建iframe

javascript - 实现一个完整的页面动画加载器

javascript - 将 .ajaxComplete() 与另一个框架生成的 ajax 请求一起使用

javascript - 如何仅将字符串的一部分呈现为 HTML

ruby-on-rails - Heroku: Errno::ECONNREFUSED (连接被拒绝 - connect(2)):

javascript - 禁止点击带有透明图片或 javascript 的特定区域更好?

括号的 Javascript 优先级

ruby-on-rails - Rails Controller 查找器模式用于干燥帐户过滤器

javascript - 使用动画单击按钮时需要移动到顶部

ruby-on-rails - 尝试生成devise用户时出现语法错误