我有两种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
);
}
我试过
'/((^<a) .......... )/iex'
但没有成功。如何仅匹配文本等电子邮件链接,而不是真正的电子邮件链接?
答案 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更常被阅读而不是书面。