У меня возникла проблема с преобразованием обычного текста в 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 вам, ребята.