Forum Webscript.Ru
Программирование => JavaScript & JScript => Тема начата: Viktor Kudlak от 02 Января 2005, 08:49:07
-
Пишу клас для сериализации данных, но застопорился на написании функции добавления слешей (к примеру замена " на \\" и т.д.)
Пробовал писать по разному, но постоянно возникают подводные камни. Кто уже писал подобные рег. экспы, подскажите пожалуйста. Далее эти строки нужно будет использовать в объекте подобном этому:
var obj = {0:"Привет Мир!\\nPS. Витек!!!"};
Писал так, но есть проблемы с тем, что \\\\$1 распознается именно как \\$1, если поставить пробел перед $1, то все нормально, но что мне делать с этими пробелами :(, если только заменять последовательность "\\\\\\s" на "\\\\", но опять же это не правильно, т.к. всякое может быть:
function addslashes (str) {
var reg1 = /(["\']{1})/g;
var reg2 = /[\\r]{1}/g;
var reg3 = /[\\n]{1}/g;
str = str.replace(reg1, "\\\\$1");
str = str.replace(reg2, "\\\\r");
str = str.replace(reg3, "\\\\\\n");
return str;
}
пробовал даже так, но возникают проблемы с русскими символами:
function addslashes (str) {
var re = /%/g;
str = escape(str);
str = str.replace(re, \'\\\\x\');
return str;
}
-
Viktor Kudlak:
Писал так, но есть проблемы с тем, что \\\\$1 распознается именно как \\$1,
это как еще ?
вызываю alert(addslashes(\'"test"\'))
мне выводит \\"test\\"
Смотрел под MSIE и FireFox-ом
Функцию можно упростить до :
function addslashes (str) {
var reg1 = /(["\'\\r\\n]{1})/g;
str = str.replace(reg1, "\\\\$1");
return str;
}
-
\\$1 - это именно так, т.е. не подставляя значания, которое в $1...
Слушай, не поверишь!
Вчера у меня автоматом скачался последний Сервис Пак для W2k, и после установки, тут же заработало в MS IE 6.0.
Я уж не знаю, может я что-то подправил и сам не обратил внимания, но теперь и у меня работает...
Ладно, всем спасибо, теперь работает..
Кому интересно:
function serialize(obj) {
var str = new String();
str = \'{\';
i = 0;
for (var item in obj) {
str += (i > 0?\',\':\'\') + item + \':\' + getitemtype(obj[item]);
i++;
}
str += \'}\';
return str;
}
function unserialize(str) {
eval(\'obj = \' + str);
return obj;
}
function getitemtype(item) {
if(item === undefined) {
return "\'\'";
} else if(typeof(item) == \'object\') {
var ret = serialize(item);
return ret;
} else if(typeof(item) === \'number\') {
return item;
} else if(typeof(item) == \'string\') {
return "\'" + addslashes(item) + "\'";
} else if(typeof(item) == \'function\') {
//return item;
return "\'\'";
} else {
alert(\'Unknown serialize type: \' + typeof(item));
}
}
function addslashes (str) {
var reg1 = /(["\']{1})/g;
var reg2 = /[\\r]{1}/g;
var reg3 = /[\\n]{1}/g;
str = str.replace(reg1, "\\\\$1");
str = str.replace(reg2, "\\\\r");
str = str.replace(reg3, "\\\\n");
return str;
}
function stripslashes(str) {
re = /\\\\([\'"]{1})/g;
str = str.replace(re, \'$1\');
return str;
}