带有前缀和后缀的正则表达式电子邮件文本

时间:2013-01-15 11:22:15

标签: php regex email prefix

我有两种html / text:

  1. My email is username@domen.com
  2. My email is <a href="mailto:username@domen.com">username@domen.com</a>
  3. 此外,我有搜索电子邮件链接的功能,并用<a href="email@address">email@address</a>模式替换它们,它可以工作。但是,如果文本已包含电子邮件链接,该怎么办?我也不想匹配它们。

    function make_email_links($text)
    {
      return  preg_replace(
         array('/(([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-]+)
           (\\.[A-Za-z0-9-]+)*)/iex'
           ),
         array( 
           "stripslashes((strlen('\\2')>0?'<a href=\"mailto:\\0\">\\0</a>':'\\0'))" 
           ),
           $text
       );
    }
    

    我试过

    '/((^<a) .......... )/iex'
    

    但没有成功。如何仅匹配文本等电子邮件链接,而不是真正的电子邮件链接?

2 个答案:

答案 0 :(得分:1)

你应该试试这个:

$formattedTest = preg_replace("#(^|[\n ])([a-z0-9&\-_\.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $text);

我使用旧的(这不起作用!):

$formattedTest = preg_replace('/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/', '<a href="mailto:\\1">\\1</a>', $text);

但正如你所说,即使它已经在标签内,它也会复制我的电子邮件。

答案 1 :(得分:0)

怎么样:

if (strstr($text, "<a href") !==false)
   return $text

在你做preg_replace之前? (甚至更省钱的正则表达式)。不要浪费你的时间试图让一切都变成“一个”大的模式。请记住:SourceCode更常被阅读而不是书面。