Страницы

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

среда, 10 апреля 2019 г.

Сделать ссылку кликабельной

Нужно сделать преобразователь вставленных урлов в кликабельные ссылки, причём даже без http://. Выходит что попало, так как не дружу с регулярками, вот код:
$text = 'Тестик test.ru http://test.ru'; $text = preg_replace('`(http(?:s)?://\w+[^\s\[\]\<]+)`i', '$1', $text); $text= preg_replace('/[a-zA-Z0-9]+\.(ru|com|net)/i', '$1', $text); echo $text;


Ответ

$text = 'Тестик 1.test.ru 2.test.ru ok 3.https://test.ru'; $patt = array( '%\b(?]*)%i', '%\b(?]*>)(?![^<>]*)%i' ); $repl = array( '$1', '$0' ); $text = preg_replace($patt, $repl, $text); echo $text;
Здесь:
\b - граница слова, тут нужна для захвата всего слова (например test), а не его части (est);
(?);
(?(?![^<>]*) - исключает захват ссылки из тега A (например от сюда test.ru ok);
(?!["\'][^<>]*>) - исключает захват ссылки из тега A (например от сюда ).
P.S. Данное решение все равно не учитывает всех нюансов ;)
UPD Вариант с более сложными регулярками, приближенными к RFC 1738
$text = 'Тестик 1. abc.test.ru 2.
http://test.ru ok 3. https://test.ru/search?search_id=975080714'; $patt = array( '%\b(?https?://|www\.)([\p{L}\p{N}]+[\p{L}\p{N}\-]*\.(?:[\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]{2,})(?::\d+)?(?:(?:(?:/[\p{L}\p{N}$_\.\+!\*\'\(\),\%;:@&=-]+)+|/)(?:\?[\p{L}\p{N}$_\.\+!\*\'\(\),\%;:@&=-]+)?(?:#[^\s\<\>]+)?)?(?![^<]*+)%u', '%\b(?]+)?|\b)(?![^<]*+)%u' ); $repl = array( '$1', '$1' ); $text = preg_replace($patt, $repl, $text); echo $text;

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

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