我有一个“允许的链接”的哈希值可以在我的 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
我尝试将不带引号的正则表达式放在后端,但结果是相同的
我能做什么?
最佳答案
这里有两个独立的问题:
- 转义将是一场噩梦,因为每个人(Ruby、(Java|Coffee)Script、正则表达式)都想使用
\
作为转义字符。 - 将动态字符串转换为 (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/