Подсветка ссылок в тексте функцией php

40
14 июня 2018, 18:00

Нужно в тексте $text найти ссылки, которые могут быть в разных форматах и сделать их реальными ссылками, т.е. добавить

<a href="http://google.com" target="_blank">http://google.com</a>

Есть такой пример

Но он не работает, если текст со ссылкой внутри заканчивается тегом, например:

<p>Вот так выглядит ссылка на сайт <a href="http://google.com" target="_blank">http://google.com</a></p>

В этом случае ссылка получается с окончанием

<p>Вот так выглядит ссылка на сайт <a href="http://google.com/%3C/p%3E">http://google.com</a></p>

Подскажите, пожалуйста, как доработать скрипт, чтобы он корректно такие тексты обрабатывал.

Вот еще пример функции, но она отрабатывается также, заканчивается тегом P:

return preg_replace_callback(
'{
  (?:
    (\w+://)          # протокол с двумя слэшами
    |                 # - или -
    www\.             # просто начинается на www
  )
  [\w-]+(\.[\w-]+)*   # имя хоста
  \S*                 # URI (но БЕЗ кавычек)
  (?:                 # последний символ должен быть...
      (?<! [[:punct:]] )  # НЕ пунктуацией
    | (?<= [-/&+*]     )  # но допустимо окончание на -/&+*
  )
}xi',
"hrefCallback",
$text

);

Нужно поправить одну из этих функций или обе или может есть более простой вариант?

Answer 1

Проверяйте позицию подстроки, в которой перед протоколом http отсутствует атрибут href=". Таким образом существующие ссылки не будут модифицированы:

$str = '
    какой-то текст и <a href="http://site.com">Ссылка</a>
    и ещё ссылка https://google.com
';
$patt = '~(?<!href=")https?://\S+~';
$repl = '<a href="$0" target="_blank">$0</a>';
echo preg_replace($patt, $repl, $str);
READ ALSO
Знак равно в параметре action

Знак равно в параметре action

Наткнулся на такую строчку кода:

65
Как правильно заполнить форму с помощью JS без потери данных?

Как правильно заполнить форму с помощью JS без потери данных?

Как правильно заполнить форму при помощи JS и залить форму с данными в БД? Надо при соответствующим выборе выпадающего списка автоматически...

36