2012-04-20 246 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