1

我有两种 html/text 案例:

  1. My email is username@domen.com
  2. My email is <a href="mailto:username@domen.com">username@domen.com</a>

此外,我的功能是搜索电子邮件链接,并用<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'

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

4

2 回答 2

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);

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

于 2013-01-15T11:40:15.687 回答
0

怎么样:

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

在你做 preg_replace 之前?(甚至是更节省的正则表达式)。不要浪费时间试图将所有东西都变成“一个”大模式。请记住:源代码的阅读次数多于编写次数。

于 2013-01-15T11:52:54.857 回答