2016-10-22 3 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 Pages (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. Можем ли мы также сохранить исходное регулярное выражение с нормальными строками? Было сложно выбрать между тремя ответами, но вы были первыми;) Во всяком случае, я нашел лучший способ использовать GreaseMonkey с вложением Content Script Injection: https://stackoverflow.com/questions/2303147/injecting-js-functions -into-the-page-from-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

Вы используете шаблонные литералы с буквальными строками в качестве регулярных выражений, и вам нужно удвоить слэш или любой другой специальный символ в этих обычных e Xpressions.

Javascript интерпретирует и удаляет первый escape-символ при разборе строкового литерала, и вам нужен escape-символ, чтобы сделать его в скрипте, поэтому вам понадобятся два из них.

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

Спасибо. Для информации это также происходит с обычными строками, а не только с литералами шаблонов ES6. – baptx

+0

Да, это произойдет с любой строкой, которую вы вставляете, поскольку первый escape-символ теряется при разборе строкового литерала, и вам всегда понадобятся два из них, обычно называемых «двойным экранированием» в javascript, когда вы делаете такие вещи, как это. – adeneo

+0

Вы или кто-то еще знаете, почему ошибка JavaScript называется 'SyntaxError: ожидаемое выражение, got '.'', которое'. ' они говорят? – baptx