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