Преобразование текста в ссылку – проблема с регулярным выражением php

У меня возникла проблема с преобразованием обычного текста в URL. Мне нравится, если у меня есть такой текст: www.google.com, он преобразуется в

<a href="www.google.com" target="_blank">www.google.com</a> 

Я вроде RegEx noob, но я пробовал это:

 $description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $description); 

Описание var – это фрагмент текста, который может содержать непроизведенные URL-адреса.

С приведенным выше кодом я получаю это как ссылку:

 <a target="_blank">www.google.com</a> 

Таким образом, часть href не учитывается. Это, должно быть, кусок пирога для вас, мастера RegEx, поэтому заранее за каждую помощь.

Если есть другой способ (лучше?) Преобразовать обычный текст в url, вы можете сказать это, и я попробую.

Если ваша единственная проблема заключается в том, что ссылка неправильно указывает на www.google.com вместо полного URL-адреса, например http://www.google.com , то правильная замена будет следующей:

 $description = preg_replace('@(www.([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="http://$1" target="_blank">$1</a>', $description); 

<a href="www.example.com">www.example.com</a> не будет корректно работать в современных браузерах, потому что значение href будет просто добавлено к текущему URL-адресу страницы, например http://example.com/www.example.com . Вам нужно указать протокол, т.е. http / https и т. д.

Ниже будут заменены все текстовые «ссылки», начинающиеся с ftp, http, https и файлов с html тегами

 <?php $pattern = '/(www|ftp|http|https|file)(:\/\/)?[\S]+(\b|$)/i'; $string = 'hello http://example.com https://graph.facebook.com http://www.example.com www.google.com'; function create_a_tags( $matches ){ $url = $matches[0]; if ( 'www' == $matches[1] ){ $url = 'http://' . $matches[0]; } $escaped = htmlspecialchars($matches[0]); return sprintf( '<a href="%s">%s</a>', $url, $escaped ); } echo preg_replace_callback( $pattern, 'create_a_tags', $string ); ?> 

печать

 hello <a href="http://example.com">http://example.com</a> <a href="https://graph.facebook.com">https://graph.facebook.com</a> <a href="http://www.example.com">http://www.example.com</a> <a href="http://www.google.com">www.google.com</a> 

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

Я предлагаю вам отказаться от своего регулярного выражения и вместо этого использовать перебранку gruber . Решение (PHP 5.3) может выглядеть так:

 <?php $string = 'hello http://example.com https://graph.facebook.com http://www.example.com www.google.com ftp://example.com'; $string = preg_replace_callback('#(?i)\b((?:[az][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”'']))#iS', function($m) { // use http as default protocol, if none given if (strpos($m[0], '://') === false) { $m[0] = 'http://' . $m[0]; } // text -> html is a context switch, take care of special characters $_m = htmlspecialchars($m[0]); return '<a href="' . $_m . '" target="_blank">' . $_m . '</a>'; }, $string); echo $string, "\n"; 

Я нашел решение. Это действительно не имело никакого отношения к RegEx, это было правильно. Мой коллега добавил эту строку кода jquery в голову:

 $("a").removeAttr('href'); 

Таким образом, очевидно, что атрибут href удаляется. Я не смотрел на это, потому что был уверен, что это проблема php / regex. Устранение этого устранило проблему.

Я понимаю, что это была глупая ошибка, и вам было невозможно решить эту проблему, так что спасибо за помощь, +1 вам, ребята.