Нужно сделать преобразователь вставленных урлов в кликабельные ссылки, причём даже без 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;
Комментариев нет:
Отправить комментарий