2016-10-22 35 views
1

有人知道这个JavaScript错误来自哪里吗?SyntaxError:预期表达式,得到'。'

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/[email protected]" 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上的页面(的jsfiddle并没有我的情况下工作):

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

+0

你应该直接通过了相关代码的问题(如果你删除回购)和正确的链接应指向一个特定的版本,而不是到主分支 - [https://github.com /baptx/baptx.github.io/blob/65f11b77df5a7464365374b3505921a4ef9b1272/get_m3u8_debug/get_m3u8_debug.htm](https://github.com/baptx/baptx.github.io/blob/65f11b77df5a7464365374b3505921a4ef9b1272/get_m3u8_debug/get_m3u8_debug.htm) – Aprillion

+0

@Aprillion谢谢,我想过在StackOverflow上添加代码,但我希望人们也能看到所有的工作案例。通常我不会删除回购,但我有想法备份Wayback Machine上的链接https://web.archive.org/web/20161022102615/https://baptx.github.io/get_m3u8_debug/get_m3u8_debug.htm 如果我想修正错误,请在特定版本的好处。 – baptx

回答

3

你逃避正斜杠,而不是有baskward斜线。

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

你需要躲避反斜杠以及:

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

您还可以利用模板字符串与string representation of a regex的优势,得到它的源代码表示。基本上,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'; 
+0

谢谢,'$ {regex.source}'是保持原始正则表达式的绝妙技巧。我认为它只适用于ES6模板文字。我们是否也可以使用普通字符串保留原始正则表达式?很难在3个答案中进行选择,但是您是第一个;)无论如何,我已经找到了一种更好的方式来使用GreaseMonkey和Content Script Injection:https://stackoverflow.com/questions/2303147/injecting-js-functions -in-a-greasemonkey -script-on-chrome/2303228#comment67649467_2303228 – baptx

+1

需要注意的是'regex.source'不能用于标志,那么你必须添加'regex.flags也是ES6,目前的浏览器不支持 – adeneo

+0

@baptx如果你正在做一个UserScript,只需执行'// @grant none',你就不需要注入一个内容脚本。 https://wiki.greasespot.net/Content_Script_Injection – Artyer

2

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

/video\/(.*)@/ 

相同

new Regex("video\\/(.*)@") 
2

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

解析字符串文字时,Javascript将解释并删除第一个转义字符,并且您需要使用转义字符将其转换为脚本,因此您需要其中的两个。

var text = ` 
     (function() { 
      var id = el.href.match(/video\\/(.*)@/)[1]; 
      alert("test 4 - regex with slash as text: " + id); 
     })();`; 
+0

谢谢。有关信息,它也会出现在普通字符串中,而不仅仅是ES6模板文字。 – baptx

+0

是的,它会在你插入任何字符串时发生,因为第一个转义字符在解析字符串时丢失了,并且你总是需要其中的两个,通常在JavaScript中执行时通常称为“双重转义”这个。 – adeneo

+0

您或其他人是否也知道为什么JavaScript错误被称为'SyntaxError:expected expression,got'。','。'。他们在说什么? – baptx

相关问题