2010-10-20 140 views
1

我正在从事一个项目,我需要从domain.comwww.domain.comhttp(s)://www.domain.com和电子邮件地址到正确的html <a>标记替换文本网址。我过去使用的是一个很好的解决方案,但它使用了现在贬值的eregi_replace函数。最重要的是,用于此功能的正则表达式不适用于preg_replacePHP的正则表达式文本链接到HTML链接

所以基本上,用户输入的可能/可能不包含链接/电子邮件地址的消息,我需要一个正则表达式与preg_replace工程,以替代该路段/电子邮件与像<a href="link">link</a>一个HTML链接。

请注意,我也有其他多个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)); 

回答

6

我创建了一个非常基本设置此正则表达式。不要指望它们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)); 
+0

优秀的男人!你知道你在做什么!我很感谢你对这个的帮助。 – 2010-10-24 18:55:54

+0

快速注释 - 关闭后添加分号)进行$ replace。 – 2011-05-23 14:15:20

+0

@Lucanos这很棒,但url一个,不支持括号。 – Vallentin 2014-07-30 20:05:30