Как добавить тег привязки к URL из текстового ввода

Я хочу иметь возможность вводить введенный пользователем текст в поле комментария и проверять выражение типа 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> 

Solutions Collecting From Web of "Как добавить тег привязки к URL из текстового ввода"

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

Ниже приведен один пример:

 $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); } 

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

 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 

Надежда помогает кому-то.

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

Уточнение ответа Markd, чтобы избежать ссылок на десятичные числа, проценты, числовые даты (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: // http://www.google.com /
https: // http://www.google.com/ .
http://www.google.com
http://www.google.com .
http://www.google.com/test
google.com
google.com ,
google.com/test
http://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

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

123.com/test (числовые домены без «www»)
Следите за популярным мнением …….. сохраняйте средний (многоточие)
Рост 3,8% до 3,94 млн. С 3,79 млн. (В процентах и ​​десятичных знаках)
Отредактировано Andrew Brooke – 07.08.2013 19:57 (dd.mm.yyyy date)
10.1.1.1 (IP-адреса)

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

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

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