ОБНОВЛЕНИЕ: Обратите внимание, что это решение, которое должно применяться к старым браузерам или платформам, отличным от браузера, и поддерживается в целях обучения. Пожалуйста, обратитесь к нижеприведенному ответу @radicand для получения более актуального ответа.
Это строка с unicode, escaped. Сначала строка была экранирована, затем закодирована с помощью unicode. Чтобы вернуться в нормальное состояние:
var x = "http\\u00253A\\u00252F\\u00252Fexample.com";
var r = /\\u([\d\w]{4})/gi;
x = x.replace(r, function (match, grp) {
return String.fromCharCode(parseInt(grp, 16)); } );
console.log(x); // http%3A%2F%2Fexample.com
x = unescape(x);
console.log(x); // http://example.com
Объяснить: Я использую регулярное выражение для поиска \u0025
. Однако, поскольку для моей операции замены требуется только часть этой строки, я использую круглые скобки, чтобы изолировать часть, которую я буду использовать повторно, 0025
. Эта изолированная часть называется группой.
Часть gi
в конце выражения означает, что она должна соответствовать всем экземплярам в строке, а не только первой, и что сопоставление должно быть нечувствительным к регистру , Это может выглядеть излишним с учетом примера, но оно добавляет универсальность.
Теперь, чтобы преобразовать из одной строки в другую, мне нужно выполнить несколько шагов для каждой группы каждого совпадения, и я не могу этого сделать что просто преобразует строку. Полезно, что операция String.replace может принимать функцию, которая будет выполняться для каждого совпадения. Возврат этой функции заменит совпадение в строке.
Я использую второй параметр, который принимает эта функция, которая является группой, которую я должен использовать, и преобразовываю ее в эквивалентную последовательность utf-8, а затем используйте встроенную функцию unescape
для декодирования строки к его надлежащей форме.