Как заменить двойную кавычку на двойную кавычку escape-char в строке с помощью JavaScript?

Скажем, у меня есть строковая переменная (var str) следующим образом:

Чувак, он точно сказал, что ты крутой!

Теперь, если я хочу, чтобы это выглядело следующим образом:

Чувак, он точно сказал, что ты крутой!

Как это сделать с помощью функции JavaScript replace()?

str.replace("\"","\\""); работает не так хорошо. Выдает ошибку unterminated string literal.

Теперь, если приведенное выше предложение должно быть сохранено в базе данных SQL, скажем, в MySQL как тип данных LONGTEXT (или любой другой VARCHAR-подобный), какие еще оптимизации строк я нужно выполнить?

Кавычки и запятые не очень удобны для строк запроса. Я также был бы признателен за несколько предложений по этому вопросу.


person Samik Sengupta    schedule 17.07.2012    source источник


Ответы (3)


Для этого вам нужно использовать глобальное регулярное выражение. Попробуйте так:

str.replace(/"/g, '\\"');

Ознакомьтесь с синтаксисом регулярных выражений и параметрами функции замены в статье Использование регулярных выражений в JavaScript. .

person Willem D'Haeseleer    schedule 17.07.2012
comment
Почему регулярное выражение необходимо для замены литеральных строк? - person Peter Mortensen; 19.07.2020
comment
@PeterMortensen это может быть необходимо, например, при работе с GraphQL, скаляры которого обычно включают только ID, String, Int, Float, Boolean, поэтому нет карт и т. д. С помощью этого метода можно легко сохранять объекты в виде строк, которые могут быть полезны в определенных ситуациях. без регулярного выражения JSON будет экранирован, и запросы не будут выполнены. - person Christoffer; 16.10.2020

Попробуй это:

str.replace("\"", "\\\""); // (Escape backslashes and embedded double-quotes)

Или используйте одинарные кавычки, чтобы указать ваш поиск и заменить строки:

str.replace('"', '\\"');   // (Still need to escape the backslash)

Как указал helmus, если первый параметр, переданный .replace(), является строкой, он заменит только первое вхождение. Чтобы заменить глобально, вы должны передать регулярное выражение с флагом g (глобальный):

str.replace(/"/g, "\\\"");
// or
str.replace(/"/g, '\\"');

Но почему вы вообще делаете это в JavaScript? Можно использовать эти escape-символы, если у вас есть строковый литерал, например:

var str = "Dude, he totally said that \"You Rock!\"";

Но это необходимо только в строковом литерале. То есть, если для вашей переменной JavaScript установлено значение, которое пользователь ввел в поле формы, вам не нужно это экранирование.

Что касается вашего вопроса о хранении такой строки в базе данных SQL, вам снова нужно экранировать символы только в том случае, если вы встраиваете строковый литерал в свой оператор SQL, и помните, что escape-символы, которые применяются в SQL, не являются (обычно) так же, как для JavaScript. Вы бы сделали любое экранирование, связанное с SQL, на стороне сервера.

person nnnnnn    schedule 17.07.2012
comment
это не сработает, так как будет заменена только первая двойная кавычка - person Willem D'Haeseleer; 17.07.2012
comment
@nnnnnn Спасибо за дополнительную информацию об экранировании SQL-запросов. Для тестового проекта, над которым я работал, я решил экранировать все обязательные экранирующие символы, прежде чем отправлять их в виде строки в запросе на сервер. - person Samik Sengupta; 17.07.2012
comment
Вы не отправляете SQL-запросы из JS на сервер, не так ли? Это было бы серьезной проблемой безопасности. (Кроме того, я никогда не использовал MySQL, но базы данных, которые я использую, такие как SQLServer, DB2 и Oracle, не нуждаются в экранировании двойных кавычек и не экранируют одиночные символы с помощью обратной косой черты...) - person nnnnnn; 17.07.2012

Другие ответы будут работать для большинства строк, но вы можете в конечном итоге отменить экранирование уже экранированной двойной кавычки, что, вероятно, не то, что вам нужно.

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

var test_str = '"first \\" middle \\" last "';
var result = test_str.replace(/\\/g, '\\\\').replace(/\"/g, '\\"');

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

person derekmc    schedule 14.05.2018
comment
Да, это более надежное решение. - person Peter Mortensen; 21.07.2020