Regex电子邮件文本与前缀和后缀



我有两种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
   );
}

I tried with

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

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

你应该试试这个:

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

但是就像你说的,它会复制我的电子邮件,即使它已经在一个标签内。

如何:

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

在执行preg_replace?(或者更多的保存正则表达式)。不要浪费你的时间试图把所有的事情都纳入"一个"大模式。请记住:源代码通常是阅读的,而不是编写的。

最新更新