Как заменить "с \" в JavaScript - PullRequest
       5

Как заменить "с \" в JavaScript

7 голосов
/ 12 августа 2011

У меня есть текстовое поле, которое отправляет информацию на сервер, и оно в формате JSON.Допустим, я хочу ввести две кавычки для значения, и структура JSON будет выглядеть так:

{
    "test": """"
}

Мне нужно, чтобы она выглядела так:

{
    "test": "\"\""
}

, поэтому она будет следовать JSONстандартов и могут быть разбираемыми / строковыми.

Я пытался использовать

 var val = myVal.replace('"', "\\\"");

, но это не сработало.val заканчивается только одной экранированной кавычкой, например \"" Любая помощь очень ценится!

Ответы [ 4 ]

9 голосов
/ 12 августа 2011

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

  • Пользователь введет текстовую строку в текстовое поле;
  • Ваш скрипт будет читать содержимое текстового поля и использовать его как значение одного из элементов в строящейся JSON-строке;
  • Сценарий отправляет полученную в результате строку JSON вкаким-то образом.

Если я правильно понял, давайте продолжим ...


Базовый код

Итак, с некоторыми заполнителями, вы 'выполняется:

function get_contents_of_textbox() {
   // Dummy data for example
   return 'My mum pushed and I said "Hello World"!';
}

function send_to_server(json_str) {
   // Dummy action: display JSON string
   console.log(json_str);
}

var myVal = get_contents_of_textbox();
var JSON  = '{ "test": "' + myVal + '" }';
send_to_server(JSON);

Демонстрация в реальном времени , показывающая искаженный JSON.


Начальная попытка

Чтобы убедиться, что JSONдопустимый, escape любые кавычки и обратные слэши, которые он может содержать.Вы уже дали ему ход:

myVal = myVal.replace('"', "\\\"");

и результат вашей попытки :

{ "test": "My mum pushed and I said \"Hello World"!" }

Только первая кавычка была экранирована.Это связано с тем, что по умолчанию заменяется только один экземпляр строки поиска.

Документация Mozilla говорит :

Чтобы выполнить глобальный поиск и заменить, либовключите флаг g в регулярное выражение или, если первый параметр является строкой, включите g в параметр flags.


Рабочая попытка

К сожалению, flagsпараметр нестандартный, поэтому давайте переключимся на версию регулярного выражения replace и используем в ней переключатель /g:

myVal = myVal.replace(/"/g, '\\"');

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

Результат:

{ "test": "My mum pushed and I said \"Hello World\"!" }

Live демо. Ура!


Полное решение

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

function get_contents_of_textbox() {
   // Dummy data for example
   return 'My mum pushed [a back\\slash] and I said "Hello World"!';
}

function send_to_server(json_str) {
   // Dummy action: display JSON string
   console.log(json_str);
}

var myVal = get_contents_of_textbox();
myVal = myVal.replace(/\\/g, '\\\\'); // escape backslashes
myVal = myVal.replace(/"/g, '\\"');   // escape quotes

var JSON  = '{ "test": "' + myVal + '" }';
send_to_server(JSON);

Результат:

{ "test": "My mum pushed [a back\\slash] and I said \"Hello World\"!" }

Живая демоверсия.

4 голосов
/ 12 августа 2011

Используйте это

var val = myVal.replace(/"/g, '\\"');
0 голосов
/ 12 августа 2011

Как вы сказали, вы получаете строку из текстового поля, вам не нужно ничего с ней делать, чтобы вернуть ее на сервер.Если вы получите значение текстового поля в нотации jQuery $() или в чистом document.getElementById, оно уже будет правильно экранировано.JavaScript не берет значение вашего текстового поля и пытается поместить его в кавычки.

Если в текстовое поле введено "", document.getElementById('mytextbox').value не равно "\"\"".Обратная косая черта необходима только при определении строкового литерала.

Попробуйте удалить все экранирующие символы и заменить регулярные выражения и просто отправить данные обратно из текстового поля, ничего не делая с ним.Ваш JSON должен выглядеть примерно так:

{
    "test" : document.getElementById('myTextBox')
}
0 голосов
/ 12 августа 2011

Просто создайте массив JS

var arr = {
   test: '""'
}

и позвольте интерфейсу JSON обработать экранирование для вас. Вам никогда не придется разбираться с деталями самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...