Как добавить тег привязки к 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>
11
задан Douglas 24 December 2009 в 17:09
поделиться

4 ответа

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

Один пример , найденный онлайн, выглядит следующим образом:

$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);
}
22
ответ дан 3 December 2019 в 01:16
поделиться

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

.
2
ответ дан 3 December 2019 в 01:16
поделиться

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

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

1
ответ дан 3 December 2019 в 01:16
поделиться

Я адаптировал опцию regex Джонатана Сэмпсона так, чтобы она была более мягкой в отношении того, что является доменом (не требует 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

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

13
ответ дан 3 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: