Как добавить тег привязки к URL из текстового ввода - PullRequest
11 голосов
/ 24 декабря 2009

Я хочу иметь возможность взять введенный пользователем текст в поле комментария и проверить выражение типа URL, а если он существует, добавить тег привязки (к URL) при отображении комментария.

Я использую PHP на стороне сервера и Javascript (с jQuery) на клиенте, так что я должен подождать, чтобы проверить URL, пока он не отобразился? Или добавить тег привязки перед вставкой в ​​базу данных?

так

<textarea id="comment">check out blahblah.com or www.thisthing.co.uk or http://checkthis.us/</textarea>  

становится

<div id="commentDisplay">check out <a href="blahblah.com">blahblah.com</a> or <a href="www.thisthing.co.uk">www.thisthing.co.uk</a> or <a href="http://checkthis.us/">http://checkthis.us/</a></div>

Ответы [ 7 ]

22 голосов
/ 24 декабря 2009

Сначала запрос. Не делайте этого перед записью данных в базу данных. Вместо этого, сделайте это до отображения данных конечному пользователю. Это позволит избежать путаницы и даст вам больше гибкости в будущем.

Один пример найден в сети :

$text = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $text);

И гораздо более тщательный от daringfireball.net :

/**
 * Replace links in text with html links
 *
 * @param  string $text
 * @return string
 */
function auto_link_text($text)
{
   $pattern  = '#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#';
   $callback = create_function('$matches', '
       $url       = array_shift($matches);
       $url_parts = parse_url($url);

       $text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
       $text = preg_replace("/^www./", "", $text);

       $last = -(strlen(strrchr($text, "/"))) + 1;
       if ($last < 0) {
           $text = substr($text, 0, $last) . "&hellip;";
       }

       return sprintf(\'<a rel="nowfollow" href="%s">%s</a>\', $url, $text);
   ');

   return preg_replace_callback($pattern, $callback, $text);
}
13 голосов
/ 22 июля 2010

Я адаптировал опцию регулярных выражений Джонатана Сэмпсона, чтобы она более снисходительно относилась к тому, что является доменом (не требуется http (s) для квалификации).

function hyperlinksAnchored($text) {
    return preg_replace('@(http)?(s)?(://)?(([-\w]+\.)+([^\s]+)+[^,.\s])@', '<a href="http$2://$4">$1$2$3$4</a>', $text);
}

Работает для этих URL (и успешно пропускает конечный период или запятую):

http://www.google.com/
https://www.google.com/.
www.google.com
www.google.com.
www.google.com/test
google.com
google.com,
google.com/test
123.com/test
www.123.com.au
ex-ample.com
http://ex-ample.com
http://ex-ample.com/test-url_chars.php?param1=val1.
http://ex-ample.com/test-url_chars?param1=value1&param2=val+with%20spaces

Надеюсь, это кому-нибудь поможет.

3 голосов
/ 06 апреля 2018

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

public function formatLinksInText($text)
{
    //Catch all links with protocol      
    $reg = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}(\/\S*)?/'; 
    $formatText = preg_replace($reg, '<a href="$0" style="font-weight: normal;" target="_blank" title="$0">$0</a>', $formatText);

    //Catch all links without protocol
    $reg2 = '/(?<=\s|\A)([0-9a-zA-Z\-\.]+\.[a-zA-Z0-9\/]{2,})(?=\s|$|\,|\.)/';
    $formatText = preg_replace($reg2, '<a href="//$0" style="font-weight: normal;" target="_blank" title="$0">$0</a>', $formatText);

    //Catch all emails
    $emailRegex = '/(\S+\@\S+\.\S+)/';
    $formatText = preg_replace($emailRegex, '<a href="mailto:$1" style="font-weight: normal;" target="_blank" title="$1">$1</a>', $formatText);
    $formatText = nl2br($formatText);
    return $formatText;
}
2 голосов
/ 08 августа 2013

Уточнение ответа Маркда, чтобы избежать ссылок на десятичные числа, проценты, числовые даты (10.3.2001), многоточие и IP-адреса:

    function addLinks($text) {
    return preg_replace('@(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@', '<a target="ref" href="http$2://$4">$1$2$3$4</a>', $text);
}

Работает для:

http://www.google.com/
https://www.google.com/.
www.google.com
www.google.com .
www.google.com / test
google.com
google.com ,
google.com / test
www.123.com.au
ex-ample.com
http://ex -ample.com
http://ex -ample.com / test-url_chars.php? Param1 = val1 .
http://ex -ample.com / test-url_chars? Param1 = value1 & param2 = val + с% 20 пробелами

Не работает для:

123.com/test (числовые домены без 'www')
Так держать пресса общественного мнения ........ держите среднее значение (многоточие)
Рост на 3,8% до 3,94 млн. С 3,79 млн. (проценты и десятичные дроби)
Под редакцией Эндрю Брука - 07.08.2013 19:57 (даты дд.мм.гггг)
10.1.1.1 (IP-адреса)

2 голосов
/ 24 декабря 2009

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

1 голос
/ 24 декабря 2009

Я бы предпочел сделать это на стороне сервера. У Javascript есть "лаг"; он запускается только тогда, когда все дерево HTML DOM загружено и отображается в веб-браузере. Таким образом, может потребоваться некоторое время (хотя и короткое), прежде чем URL будут распознаны и проанализированы. Клиент может увидеть ссылки, которые были немедленно заменены, пока он все еще сталкивается с контентом. Это может привести к "WTF?" опыт на стороне клиента. В настоящее время это слишком быстро связано с рекламой / спамом / шпионским ПО. Вы должны избегать этого в максимально возможной степени. Не используйте JS для изменения загрузки контента, а делайте это только во время событий, контролируемых пользователем (onclick, onchange, onfocus и т. Д.). Используйте язык на стороне сервера для изменения содержимого перед сохранением или отображением.

Итак, просто ищите PHP-скрипт, который анализирует текст (или использует регулярные выражения) для создания полноценных ссылок на основе URL-адресов в виде простого текста. Вы можете найти много здесь . Удачи.

0 голосов
/ 15 января 2015

Просто предложите полезный плагин здесь: External Links https://wordpress.org/plugins/sem-external-links/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...