2009-04-20 8 views
50

Есть ли встроенная функция JavaScript, например, функция PHP addslashes (или addcslashes) для добавления обратных косых черт к символам, которым требуется экранирование в строке?Экранирование строк в JavaScript

Например, это:

Это демо строка с «одинарные кавычки» и «двойные кавычки».

... стал бы:

Это демо строка с \ 'одинарные кавычки \' и \ "двойные кавычки \".

+7

«Нужно ускользнуть» с какой целью? Существует много разных причин избежать строк, и правильный способ сделать это может быть различным в зависимости от цели. (например, addashes() PHP обычно является неправильным решением, когда задействован SQL: лучшее решение - это параметризованные запросы) – Miles

+0

Я действительно разрабатываю виджет Dashboard Apple, и я хочу, чтобы мои строки были правильно экранированы, прежде чем использовать их в командах терминала через «widget.system». –

+0

@SteveHarrison Это, вероятно, небезопасно. Там будут способы выйти из этого, позволяя выполнять произвольный код. Корпуса делают странные вещи с их помощью. Если вы планируете передавать ненадежные данные, единственный способ избежать необходимости делать backflips для 'system' - это использовать какую-то другую функцию вместо этого, которая позволяет вам передавать неэкономленные параметры. –

ответ

75

http://locutus.io/php/strings/addslashes/

function addslashes(str) { 
    return (str + '').replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0'); 
} 
+32

Итак, ответ «нет, нет встроенной функции, такой как добавление PHP», –

+0

Да, это ответ. –

+5

Хорошо, я добавлю эту функцию в свою [постоянно растущую] коллекцию функций/методов, которые отсутствуют в JavaScript ... Спасибо! –

36

Разновидностью функции, представленной Paolo Bergantino, который работает непосредственно на строки:

String.prototype.addSlashes = function() 
{ 
    //no need to do (str+'') anymore because 'this' can only be a string 
    return this.replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0'); 
} 

Добавив код, указанный выше в вашей библиотеке вы сможете :

var test = "hello single ' double \" and slash \\ yippie"; 
alert(test.addSlashes()); 

EDIT:

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

if(!String.prototype.addSlashes) 
{ 
    String.prototype.addSlashes = function()... 
} 
else 
    alert("Warning: String.addSlashes has already been declared elsewhere."); 
+6

Стоит отметить, что расширение родных объектов javascript рассматривается многими плохими практиками. –

+5

@BenjaminGruenbaum: если вы боитесь конфликтов, вы можете добавить 'if (! String.prototype.addSlasches)' перед расширением –

+1

Точно как это помогает? Если вы ожидаете, что одна функция addSlashes и вы получите другую, вы, вероятно, столкнетесь с очень сложной ошибкой. Лучше бросать исключение, если есть конфликт –

51

Вы также можете попробовать это за двойные кавычки :

JSON.stringify(sDemoString).slice(1, -1); 
JSON.stringify('my string with "quotes"').slice(1, -1); 
+3

Это отличный ответ. Я удивлен, что нет никакого «очевидного» встроенного метода, чтобы избежать кавычек, но это делает работу. Есть ли какие-либо оговорки? – Medorator

+1

Результат JSON.stringify() со строкой - это строка с двойными кавычками вокруг вашей строки. Это строка, которая, когда оценивается, приведет к той же самой строке, с которой вы начали. Итак, JSON.stringify («моя строка с« кавычками ») возвращает строку:« моя строка с \ quotes \ "", которую вы можете ввести в JavaScript как "моя строка с \" кавычками \ "" '. – dlaliberte

+1

Отлично. Требуется больше воздействия. – mattsven

2

Использование encodeURI()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI

Побеги почти все проблемные символы в строках для правильной кодировки JSON и транзита для использования в веб-приложениях. Это не идеальное решение для проверки, но оно ловит низко висящие фрукты.