Поиск url в тексте и превращение его в <a>

120
17 января 2020, 18:10

Есть вот такой код, он работает, но если есть <br />, то к url прибавляются частички от <br />

$new_text = preg_replace("~(http|https|ftp|ftps)://(.*?)(\s|\n|[,.?!](\s|\n)|$)~", '<a href="$1://$2">$1://$2</a>$3', $text);
return $new_text;

Например, ссылка https://www.google.com/ Если она написана в тексте вот так

https://www.google.com/

То все работает.

Если она написана в тексте вот так

Найти в Google - https://www.google.com/ Сайт Google

То все работает.

Если она написана в тексте вот так

Найти в Google https://www.google.com/<br/>
Загуглить

То ссылка поглощает частички
и все что идет после нею.

Как это исправить? И возможно ли сделать переадресацию с ссылки на определенную страницу, чтобы проверить допустим ли этот домен для перехода и т. д.

Желательно с объяснением.

Answer 1

Сделайте ограничение на угловые скобки (и пробелы):

$text = 'Найти в Google https://www.google.com/<br/>Загуглить';
$patt = '~(?:https?|ftps?)://[^<>\s]+~';
$repl = '<a href="$0">$0</a>';
$newText = preg_replace($patt, $repl, $text);
echo $newText;

Результат:

Найти в Google <a href="https://www.google.com/">https://www.google.com/</a><br/>Загуглить
READ ALSO
Скрыть class после успешной заявки для всех пользователей на сайте

Скрыть class после успешной заявки для всех пользователей на сайте

Помогите решить такой вопросНа сайте будет очень простой конкурс, на одной из страниц сайта будет расположена кнопка с классом (

137
Запрос Eloquent

Запрос Eloquent

Есть вот такая структура:

129
SetWindowsHookExA на функцию член класса

SetWindowsHookExA на функцию член класса

Пытаюсь отловить WM_ENTERSIZEMOVE и WM_EXITSIZEMOVE сообщения для окна, дескриптор которого является членом классаДля этого использую SetWindowsHookExA с параметром...

151
Изменить шрифт для всего приложения

Изменить шрифт для всего приложения

Пытаюсь подключить свой шрифт для приложенияНо он подключается, только если я поверну экран или уйду на другую активити

142