Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 04.02.2013, 18:05
Новичок на форуме
Отправить личное сообщение для nSauk Посмотреть профиль Найти все сообщения от nSauk
 
Регистрация: 25.07.2012
Сообщений: 1

Сегодня толкнулся с этим же исключением и не знаю, как найти выход.

Специфика у меня такая: от сервера 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 хватает только для кириллицы, всякие æ по-прежнему будут выпадать с ошибкой.

Последний раз редактировалось nSauk, 05.02.2013 в 01:40. Причина: upd2
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск