2014-08-16 3 views
1

Я использую JavaScript JavaScript QuickBlox. Просматривая их код, я нашел эту строку:Javascript string variable unquoted?

var URL_REGEXP = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi; 

Вероятно, он объявил переменную строку, которая является регулярным выражением. Затем он использует эту переменную таким образом:

return str.replace(URL_REGEXP, function(match) { 
     url = (/^[a-z]+:/i).test(match) ? match : 'http://' + match; 
     url_text = match; 
     return '<a href="' + escapeHTML(url) + '" target="_blank">' + escapeHTML(url_text) + '</a>'; 
    }); 

Мне интересно, как это возможно? Var, объявленный в первой строке, должен быть строкой, но он не определен. Разве это не синтаксическая ошибка?

Я пошел и протестировал этот код в своем браузере, и он работает! Это означает, что у меня есть кое-что, чтобы учиться здесь ... Может ли кто-нибудь объяснить, как объявляется эта переменная?

Кроме того, я попытался запустить тот же код на моем компьютере друзей, отладчик Chrome выдает синтаксическую ошибку в строке объявления переменных (неожиданный токен '/'). Я использую Chrome Version 36.0.1985.143 m, мой друг использует то же самое, но на моем компьютере все работает отлично, на моем компьютере друзей код останавливается при первом объявлении переменной из-за «синтаксической ошибки».

Есть ли какая-то настройка, которая отличается?

Любая помощь будет оценена по достоинству.

UPDATE

Спасибо за быстрые ответы. Я пришел из PHP-фона, поэтому подумал, что все регулярные выражения должны быть инициализированы как строки: P.

Любой может воспроизвести ошибку синтаксиса, которую я получаю на компьютере моих друзей? (Это происходит после отключения всех расширений). Я тоже не могу воспроизвести, и это меня расстраивает.

UPDATE 2

Я проверил и мои друзья компьютер и посмотрел через источник. По-видимому, это связано с некоторыми проблемами кодирования (я не уверен, что). Регулярное выражение показано, как это:

var URL_REGEXP = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?芦禄鈥溾€濃€樷€橾))/gi; 

(Символы в конце кода некоторые случайные китайские символы, кажется).

Как изменить кодировку в соответствии с его браузером/системой? (Он работает на китайской упрощенной системе Windows 7).

+2

Регулярные выражения не являются строками. – Barmar

+0

Я также не могу воспроизвести синтаксическую ошибку. Вы, должно быть, допустили ошибку при копировании на компьютер своего друга. – Barmar

+0

Хм .. Я загрузил его на веб-сервер, он доступен через URL-адрес, который вы вводите в свой браузер, поэтому файлы должны быть точно такими же, не так ли? – l3utterfly

ответ

2

Это не переменная String. Это регулярное выражение.

var varname = /pattern/flags;
является действительным для звонка var varname = new RegExp("pattern", "flags");.

Вы можете выполнить следующие действия в любом браузере, который поддерживает консоль JavaScript:

>>> var regex = /(?:[\w-]+\.)+[\w-]+/i 
>>> regex.exec("google.com") 
... ["google.com"] 
>>> regex.exec("www.google.com") 
... ["www.google.com"] 
>>> regex.exec("ftp://ftp.google.com") 
... ["ftp.google.com"] 
>>> regex.exec("http://www.google.com") 

Любой может воспроизвести ошибку синтаксиса я получаю на моих друзей компьютер?(Это происходит после отключения всех расширений). Я тоже не могу воспроизвести, и это меня расстраивает.

Согласно RegExp - JavaScript documentation:

Regex литералы присутствовал в ECMAScript 1-е издание, реализованного в JavaScript 1.1. Используйте обновленный браузер.

+0

** «Использовать обновленный браузер». ** Сколько лет вашему браузеру нужно делать? ;) –

+0

@ Qantas94Heavy Я понятия не имею. Предположительно, Chrome, Firefox, Internet Explorer, Opera и Safari имеют поддержку. Без дополнительной информации [прямое предположение] (http://www.xkcd.com/1339/) будет, если браузер очень, очень устарел. – Unihedron

+0

Я бы предположил, что ОП сделал что-то странное. Насколько мне известно, все реализации JavaScript поддерживают это, даже IE5 и ниже. –

1

Нет, это не должно быть синтаксической ошибкой. В Javascript объекты RegExp не являются строками, они представляют собой отдельный класс объектов. /.../modifiers - это синтаксис для литерала RegExp.

Я не могу объяснить синтаксическую ошибку, которую вы получили на компьютере своего друга, это выглядит хорошо для меня. Я вложил его в консоль Javascript, и все было в порядке.

+0

Является ли это отдельным типом данных или просто классом? – Rudie

+0

@Rudie 'typeof /.*/' возвращает '" object "', поэтому это просто класс со встроенным литералом. – SeinopSys