За последние 24 часа нас посетили 17599 программистов и 1312 роботов. Сейчас ищут 1053 программиста ...

Функция трансформирует текст в гиперссылку

Тема в разделе "Регулярные выражения", создана пользователем Econaft, 27 авг 2015.

  1. Econaft

    Econaft Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    89
    Симпатии:
    1
    Есть очень хорошая функция:
    Код (PHP):
    1. function hyperlink($text)
    2. {
    3. $text = preg_replace("/(([a-z]+:\/\/)?(?:[a-zа-я0-9@:_-]+\.)+[a-zа-я0-9]{2,4}(?(2)|\/).*?)([-.,:]?(?:\\s|\$))/is",'<a href=$1>$1</a>', $text);
    4.  return($text);
    5. } 
    Любая ссылка переделывается в гиперссылку. Причём независимо что стоит вначале ссылки: www или http://

    Проблема в том, что, если в конце ссылки нет пробела, то и любой текст становится ссылкой до пробела. Вот так: http://www.php.ruздесьлюбойтекстдопробела

    Как исправить?

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Всегда ставить пробел в конце. Это плата за удобство. Пробел - единственный признак конца ссылки.
     
  3. Econaft

    Econaft Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    89
    Симпатии:
    1
    Например в сети Вконтакт там хоть как ссылку ставь - она становится ссылкой точно где нужно.
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    В некоторых случаях, когда точно известен формат вставляемых ссылок, можно и исправить. Например, ссылки только из латинских букв, дальше текст - из любых нелатинских. Или в случае, если ссылка всегда заканчивается числом.

    Ну может, там как-то JS задействован. Нужно изучить.
     
  5. Econaft

    Econaft Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    89
    Симпатии:
    1
    Однако вы ошибаетесь.

    Вот этот код может
    Код (Text):
    1.  $text = preg_replace('/(http:\/\/([\w\d\.\?\&\#\;\:\+\-\=\%\/]+))/i', '<a href="$1">$1</a>', $text);
    Но я не знаю что нужно изменить в коде в первом посте темы, чтобы и там тоже это было реализовано.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    На этом форуме как раз такая регулярка которая русский не хавает.
     
  7. loerque

    loerque Новичок

    С нами с:
    16 окт 2015
    Сообщения:
    6
    Симпатии:
    0
    В Вконтакте такое только с не латинскими символами прокатывает, иногда даже латинские не берет, например иногда на гугловские запросы обрывает.
    Как вариант регулярка до домена 1 уровня, а дальше уже доп. проверки на популярные ссылки с GET-параметрами, все остальное все равно резать. Из совсем фантастично-извращенного посимвольно обрезать ссылку и curl'ом проверять ответ с сервера, если не 404, то ссылку возвращать.

    Только в обоих случаях такой функционал не будет стоить нагрузки на сервер, либо канал при высоком трафике.