PHP Регулярное выражение Текст URL URL на HTML Ссылка - PullRequest
1 голос
/ 21 октября 2010

Я работаю над проектом, в котором мне нужно заменить текстовые URL-адреса в любом месте от domain.com до www.domain.com до http(s)://www.domain.com и адреса электронной почты на соответствующий тег html <a>.В прошлом я использовал отличное решение, но оно теперь использовало устаревшую функцию eregi_replace.Кроме того, регулярное выражение, используемое для такой функции, не работает с preg_replace.

Таким образом, в основном, пользователь вводит сообщение, в котором может / не может содержать ссылку / адрес электронной почты, и яМне нужно регулярное выражение, которое работает с preg_replace, чтобы заменить эту ссылку / электронное письмо ссылкой HTML, например <a href="link">link</a>.

Обратите внимание, что у меня также есть несколько других preg_replaces.Ниже приведен мой текущий код для других замен.

$patterns = array('~\[@([^\]]*)\]~','~\[([^\]]*)\]~','~{([^}]*)}~','~_([^_]*)_~','/\s{2}/');
$replacements = array('<b class="reply">@\\1</b>','<b>\\1</b>','<i>\\1</i>','<u>\\1</u>','<br />');
$msg = preg_replace($patterns, $replacements, $msg);
return stripslashes(utf8_encode($msg));

1 Ответ

6 голосов
/ 21 октября 2010

Я создал для этого очень простой набор регулярных выражений. Не ожидайте, что они будут на 100% надежными, и вам может понадобиться настроить их по ходу.

$pattern = array(
  '/((?:[\w\d]+\:\/\/)?(?:[\w\-\d]+\.)+[\w\-\d]+(?:\/[\w\-\d]+)*(?:\/|\.[\w\-\d]+)?(?:\?[\w\-\d]+\=[\w\-\d]+\&?)?(?:\#[\w\-\d]*)?)/' , # URL
  '/([\w\-\d]+\@[\w\-\d]+\.[\w\-\d]+)/' , # Email
  '/\[@([^\]]*)\]/' , # Reply
  '/\[([^\]]*)\]/' , # Bold
  '/\{([^}]*)\}/' , # Italics 
  '/_([^_]*)_/' , # Underline
  '/\s{2}/' , # Linebreak
);
$replace = array(
  '<a href="$1">$1</a>' ,
  '<a href="mailto:$1">$1</a>' ,
  '<b class="reply">@$1</b>' ,
  '<b>$1</b>' ,
  '<i>$1</i>' ,
  '<u>$1</u>' ,
  '<br />'
);
$msg = preg_replace( $pattern , $replace , $msg );
return stripslashes( utf8_encode( $msg ) );
...