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