【问题标题】:Regular expression stored in a variable not working when matching匹配时存储在变量中的正则表达式不起作用
【发布时间】:2020-06-29 01:28:19
【问题描述】:

我有一个“允许的链接”散列在我的 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+)(?:$|/|?)//: 没什么可重复的 在 String.matc

我试过把不带引号的正则表达式放在后端,但结果是一样的

我能做什么??

【问题讨论】:

  • 将其存储为字符串文字,并使用适当的反斜杠转义,然后在初始化正则表达式对象时使用正则表达式构造函数。
  • @WiktorStribiżew 我不知道该怎么做,你能给我举个例子吗?
  • 或者更好的是,将它们存储为正则表达式文字:regex: /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|.../(即删除环绕引号)。
  • @muistooshort 这对我不起作用,如果我尝试在没有 .to_json 的情况下访问它,我会收到“缺少/(未关闭的正则表达式)”错误,我认为问题在于我使用.to_json,但我不知道
  • 抱歉,错过了 CoffeeScript 部分。为什么不一开始就用 CoffeeScript 编写它们呢?无论如何,Ruby 和 JavaScript 正则表达式是不同的。

标签: javascript jquery ruby-on-rails regex ruby


【解决方案1】:

这里有两个不同的问题:

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

【讨论】:

  • 天哪,谢谢!你真是个天才!非常感谢!
  • 再次谢谢你,我刚刚完成任务,你是我的英雄!
猜你喜欢
  • 1970-01-01
  • 2015-07-06
  • 2021-08-12
  • 2016-02-07
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多