我有两种html/text:
-
My email is username@domen.com
-
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?(或者更多的保存正则表达式)。不要浪费你的时间试图把所有的事情都纳入"一个"大模式。请记住:源代码通常是阅读的,而不是编写的。