1

有人知道这个 JavaScript 错误来自哪里吗?

SyntaxError: expected expression, got '.'

使用带有斜杠(转义)的正则表达式时出现此错误,例如el.href.match(/video\/(.*)@/)[1];传递给 createTextNode、textContent 或 innerHTML 等函数的字符串。

此正则表达式在不存储为文本时有效。一个没有斜杠的正则表达式作为文本工作,你可以看到我的代码示例:

HTML:

<a style="display: none; width: 840px; height: 472px;" href="http://videos.francetv.fr/video/147338657@Info-web" id="catchup" class="video"></a>

JavaScript:

var el = document.getElementById("catchup");
var script = document.createElement("script");
var text = `
    (function() {
        var id = el.href.match(/video\/(.*)@/)[1];
        alert("test 4 - regex with slash as text: " + id);
    })();`; 
script.appendChild(document.createTextNode(text));      
document.getElementsByTagName("head")[0].appendChild(script);

工作和失败的测试可以在这里找到:

https://github.com/baptx/baptx.github.io/blob/65f11b77df5a7464365374b3505921a4ef9b1272/get_m3u8_debug/get_m3u8_debug.htm

您可以在 GitHub Pages 上对其进行实时测试(JSFiddle 在我的情况下不起作用):

https://baptx.github.io/get_m3u8_debug/get_m3u8_debug.htm

4

3 回答 3

3

您正在转义正斜杠,而不是使用 baskward 斜杠。

`el.href.match(/video\/(.*)@/)[1]` === 'el.href.match(/video/(.*)@/)[1]'
// '\/' == '/', not '\\/'

您还需要转义反斜杠:

`el.href.match(/video\\/(.*)@/)[1]`

您还可以利用带有正则表达式的字符串表示的模板字符串来获取它的源代码表示。基本上,eval(/any regex/ + '')将得到相同的正则表达式。

var regex = /video\/(.*)@/;
var text = `el.href.match(${regex})[1]`;
// Or:
var text = `el.href.match(` + /video\/(.*)@/ + ')[1]';

/video\/(.*)@/igm + '' === '/video\\/(.*)@/gim';
new RegExp('video\\/(.*)@', 'gmi') + '' === '/video\\/(.*)@/gim';
于 2016-10-22T11:35:23.997 回答
2

如果你的意思是“作为字符串” "video\/(.*)@",那么反斜杠本身需要被转义,"\\"是一个包含一个反斜杠的字符串文字:

/video\/(.*)@/

是相同的

new Regex("video\\/(.*)@")
于 2016-10-22T11:35:38.083 回答
2

您正在使用带有文字字符串的模板文字作为正则表达式,并且您必须在这些正则表达式中对斜杠或任何其他特殊字符进行双重转义。

Javascript 在解析字符串文字时会解释并删除第一个转义字符,并且您需要转义字符才能将其放入脚本中,因此您需要其中的两个。

var text = `
        (function() {
            var id = el.href.match(/video\\/(.*)@/)[1];
            alert("test 4 - regex with slash as text: " + id);
        })();`;
于 2016-10-22T11:35:38.427 回答