Сегодня толкнулся с этим же исключением и не знаю, как найти выход.
Специфика у меня такая: от сервера API приходит текст сообщения. Чтобы сделать ссылки в этом сообщении кликабельными, я прогоняю текст через парсер, который помимо основной задачи делает ссылки читабельными с помощью decodeURIComponent — для размещения их текста внутри <a></a>. Порой сайт (VK) обрезает ссылки не в том месте, и из-за исключения работа парсера рушится. Можно ли как-то исправить положение? Отказываться от превращения читабельных ссылок в обычные не хочется, сам VK с этим ведь как-то справляется. Можно ли проверить валидность ссылки для decodeURIComponent ещё до вызова? Дописать/обрезать её так, чтобы всё работало? Применять unescape нельзя, т.к. везде кириллица. UPD через час Пока решил через try..catch, но если кто-то знает решение, позволяющее модифицировать URI до валидного состояния (чтобы можно было парсить), напишите здесь, пожалуйста. UPD2 через 7 часов Читал документацию ES5, не совсем осилил, и придумал вот что: function decodeURIComponentX( str ) { var out = '', arr, i = 0, l, x; arr = str.split(/(%(?:D0|D1)%.{2})/); for ( l = arr.length; i < l; i++ ) { try { x = decodeURIComponent( arr[i] ); } catch (e) { x = arr[i]; } out += x; } return out } decodeURIComponentX('http://vk.com/developers.php?oid=-1&p=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B9_%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%8') Уже куда лучше, чем пропускать негодный URI вообще. Но есть сомнения по поводу регулярки: во-первых, сейчас массив из-за неё получается своеобразный, с пустыми элементами, а во-вторых, %D0 и %D1 хватает только для кириллицы, всякие æ по-прежнему будут выпадать с ошибкой. |
Часовой пояс GMT +3, время: 22:43. |