Я проверил вашу оригинальную версию, хэш Ates Gorals, мой улучшенный хеш, версию с использованием переключателя и простое решение. Победитель? Простое решение!
С соответствующими данными (строка из 85 символов)
original simple hash switch ag-hash
FF3 194 188 250 240 424
IE7 188 172 641 906 2203
Chrome1 161 156 165 165 225
Opera9 640 625 531 515 734
С несоответствующими данными (строка из 85 символов):
original simple hash switch ag-hash
FF3 39 4 34 34 39
IE7 125 15 125 125 156
Chrome1 45 2 54 54 57
Opera9 156 15 156 156 156
(протестировано на моем ноутбуке с Windows XP, 1,7 ГГц, мммм)
Простое решение:
function XMLToString(str) {
return (str.indexOf("\\")<0 && str.indexOf("&")<0) ? str :
str
.replace(/\\34/g,'"')
.replace(/\\39/g,"'")
.replace(/\\62/g,">")
.replace(/\\60/g,"<")
.replace(/\\13\\10/g,"\n")
.replace(/\\09/g,"\t")
.replace(/\\92/g,"\\")
.replace(/\&/g,"&");
}
Объяснение:
Сначала выполняется проверка на наличие обратной косой черты или амперсанда (было быстрее использовать indexOf вместо регулярного выражения во всех браузерах). Если нет, строка возвращается без изменений, в противном случае выполняются все замены. В этом случае не имеет большого значения кэшировать регулярные выражения. Я попытался с двумя массивами, один с регулярными выражениями и один с заменами, но это не было большой разницей.
В вашей исходной версии у вас есть тест для всех комбинаций, чтобы определить, должны ли вы делать замены или нет. Это дорого, так как механизм регулярных выражений должен сравнивать каждую позицию с каждой комбинацией. Я упростил это.
Я улучшил Ates Gorals, переместив хеш-объект наружу (чтобы он не создавался и не выбрасывался при каждом вызове внутренней функции), перемещая внутреннюю функцию наружу, чтобы ее можно было использовать повторно вместо выбрасывания.
ОБНОВЛЕНИЕ 1 Исправление: перемещена скобка в тесте амперсанда.
ОБНОВЛЕНИЕ 2
Один из ваших комментариев заставил меня поверить, что вы сами кодируете строку, и если это так, я предлагаю вам переключить кодировку на стандартную, чтобы вы могли использовать встроенные функции.
Вместо "\ dd", где dd - десятичное число, используйте "% xx", где xx - шестнадцатеричное число. Тогда вы можете использовать встроенный decodeURIComponent, который работает намного быстрее и в качестве бонуса может декодировать любые символы, включая юникод.
matching non match
FF3 44 3
IE7 93 16
Chrome1 132 1
Opera9 109 16
.
function XMLToString_S1(str) {
return (str.indexOf("%")<0) ? str : decodeURIComponent(str).replace(/\x0D\x0A/g,"\n")
}
Таким образом, вместо строки типа "\ 09test \ 60 \ 34string \ 34 \ 62 \ 13 \ 10 \" у вас есть строка типа "% 09test% 3c% 22string% 22% 3e% 0d% 0a".