2012-04-20 140 views
1

我知道这可以使用Outlook中的设置完成,但只能为我自己排序。使用PHP阻止在Outlook等链接中使用自动链接超链接

我想什么做的是使用PHP来防止超链接只是因为有一个@符号等的文字...

据我所看到的,对我来说,唯一的选择就是编码所有@符号来其HTML数字实体,像这样:

事情是这样的:

$message = str_replace('@','@',$message); 

然而,如果可能的话,我不希望这样的事情发生,如果@符号是一个电子邮件地址的一部分。

因此我需要的是这样的:

// SOME_REGEX will match any @ sign that is NOT part of an email address 
$message = preg_replace('SOME_REGEX','@',$message); 

任何人都可以想到的任何其他更好的方法?这个计划有什么缺陷吗?任何人都可以提出一个很好的正则表达式吗?我挣扎的时候才发现编写一个@符号相匹配的正则表达式,如果它不是一个电子邮件地址的一部分

在此先感谢

回答

1

如果电子邮件地址被包裹在装饰列表中没有定义什么这是行不通的。

$chunked_message = explode(" ", $message); 

foreach($chunked_message as $chunk) { 
    $clean_chunked_message[] = 
       (!filter_var(trim($chunk, " -().?!\t\r\n", FILTER_VALIDATE_EMAIL)) 
       ? str_replace('@', '@' $chunk) : $chunk; 
} 

$clean_message = implode(" ", $clean_chunked_message); 

祝你好运。

+0

这是我最后的选择,尽管我可能会略微不同,因为可能没有空格。我宁愿使用正则表达式,但我认为它有点太复杂。我可以做的是使用正则表达式过滤掉电子邮件地址,然后替换剩下的@符号。与你几乎一样,但与正则表达式。 +1 – 2012-04-20 09:59:50

+0

谢谢。我更喜欢避免使用正则表达式,除非它适合作业或唯一的选择,因为它会增加任务的开销。它可能需要更少的线路,但是以加载正则表达式引擎为代价。 – Anthony 2012-04-20 10:01:55

+0

我完全同意,我很少使用它,但我总是用它来进行电子邮件地址验证,因为'filter_var'函数有点不可靠,就像在这种情况下一样... – 2012-04-20 10:03:38

0

这是邮件应用程序的功能来检测链路,使它可以点击。

避免这种情况的一个诡计就是在链接之间使用空格。

例子:

http://ww w.you tube.com/v=....... 
+0

这不是我想要实现的。如果应用程序支持,我想忽略有效链接并使它们可点击。但是,我想确保非链接(特定电子邮件地址)仅因为它们具有@符号而不会转换为超链接。例如,Outlook将以下内容转换为'mailto'链接:'_〜@><,。/;'#] [= - '。是的,这种角色安排不太可能出现在电子邮件中,但我的观点依然如此。这不是一个电子邮件地址,但Outlook超链接它! – 2012-04-20 09:44:21

+0

@BenCarey,我不认为我们可以在这方面做很多事情。它仍然是Outlook本身的一个特色。 – Starx 2012-04-20 09:48:43

+0

这正是我的想法,但如果我编码@符号,那么超链接将不会由Outlook或任何其他电子邮件客户端创建!这就是为什么我想要一个正则表达式来替换编码实体的非电子邮件地址@标志 – 2012-04-20 09:52:21