2016-10-22 36 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

相關問題