Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Замена ссылок в contenteditable div, кроме явно указаных

#javascript #регулярные_выражения


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

function replaceURLsInMessage(text){
    text = text.replace(/(?])(http(s)?:\/\/)?(www\.)?([-a-zA-Z0-9@:%._\+~#=]{2,256}\.(?!gif|png|jpg)[a-z]{2,6}\b)([-a-zA-Z0-9@:%_\+.~#?&//=]*)(?!["<])/g,
'$&');
    return text;
}


во первых js ругается на регулярку

во вторых, регулярка не работает если внутри тега а написана ссылка посреди текста.

второе то ладно, в приоритете первый пункт

прилагаю пример текста

fadsgfads
Смотрите в vk.com подробнее 
фывафывафыва
вафывафыва
афвыафыва м vk.com
фывафыва


вызов осуществляется следующим образом по клике на кнопку

$this.html(replaceURLsInMessage($this.html()))


в результате ожидаю увидеть следующее

fadsgfads
Смотрите в vk.com подробнее 
фывафывафыва
вафывафыва
афвыафыва м vk.com
фывафыва


то есть первая ссылка осталось не тронутая, а вторая - та что была текстом, стала
ссылкой, ссылка и в href и внутри самого тега а
    


Ответы

Ответ 1



Если хотите пользоваться регулярным выражением, можно воспользоваться захватывающими подмасками и анализировать внутри анонимного метода захваченные тексты, а потом и решать, что с ними делать. $("div").each(function() { $(this).html($(this).html().replace(/[^<]*<\/a>|((?:https?:\/\/)?(?:www\.)?([-a-zA-Z0-9@:%._+~#=]{2,256}\.(?!gif|png|jpg)[a-z]{2,6}\b)[-a-zA-Z0-9@:%_+.~#?&\/=]*)/ig, function($0, $1) { return $1 ? '' + $1 + '' : $0; })); });
fadsgfads Смотрите в vk.com подробнее фывафывафыва вафывафыва афвыафыва м vk.com фывафыва
Т.е. с помощью [^<]*<\/a> можно отловить уже готовые ссылки с тегами, а с помощью Вашего выражения (но уже в (...)) можно найти ссылки без тегов. Если подмаска №1 найдена ($1 ?), надо добавить теги. Если нет, просто вставляем обратно полное совпадение $0.

Ответ 2



Javascript не поддерживает просмотра назад в регулярных выражениях. По этому (?]) ведет к во первых js ругается на регулярку

Ответ 3



Судя по всему, ошибка в самом начале: что за неэкранированный вопросительный знак в самом начале, сразу после открывающейся скобки? Не припомню такого синтаксиса в Javascript. Если вы имели ввиду именно символ "?", а не оператор регулярки, то экранируйте его: text.replace(/(\?])(http(s)?:\/\/)?(www\.)?([-a-zA-Z0-9@:%._\+~#=]{2,256}\.(?!gif|png|jpg)[a-z]{2,6}\b)([-a-zA-Z0-9@:%_\+.~#?&//=]*)(?!["<])/g, '$&'); Теперь регулярка не выплевывает ошибку. Насколько она рабочая - судить вам. Если дадите пример сложного текста и опишите желаемое - дополним регулярку.

Комментариев нет:

Отправить комментарий