Страницы

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

четверг, 2 мая 2019 г.

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

нужно обернуть в тег а все вхождения по регулярке, но не заменять в уже готовых тегах а написал следующее
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 и внутри самого тега а


Ответ

Если хотите пользоваться регулярным выражением, можно воспользоваться захватывающими подмасками и анализировать внутри анонимного метода захваченные тексты, а потом и решать, что с ними делать.
$("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

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

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