2012-09-03 80 views
3

可能重複:
regexp to partly hide email?用PHP正則表達式部分隱藏電子郵件地址?

我目前正在寫隱藏電子郵件地址的腳本(因此[email protected]換成T ~~~ @ ~~~~~ 〜.COM)。

雖然按照這個問題的說明 - regexp to partly hide email? - 我設法讓它顯示[email protected],但我無法刪除「域」。

這裏是我到目前爲止(假設$按行>電子郵件是 「[email protected]」): -

$string = preg_replace("(?<=.).(?=.*@)","~", $row->email); 
$string = preg_replace("(?<[email protected]).[a-zA-Z0-9]*","~", $string); 

然而,所有返回爲t ~~~ @〜omain。 com

我很困惑如何獲得域的其餘部分。想法?

如果有人可以提供解決方案,那麼它就會變成[email protected]~~~~~~.com,這很好。

乾杯

+0

可能也只是完全刪除地址。 – 2012-09-03 20:40:01

回答

4

它是..

  • 匹配(和跳過)"@"然後;
  • 匹配.(任何字符:即"d""domain")然後;
  • 匹配0(零)下面的字符類,這是最低需要匹配提供的正則表達式。

即,第一和僅@之後被匹配​​並與~替換第一字符。

以下

(?<[email protected])[a-zA-Z0-9-]*(?=(?:[.]|$)) 

迫使字符類,以匹配於所述第一"."(期間,如在".com")或輸入結束。

注意,.移動內的(?<[email protected]) -Look隱藏導致它跳過"@"後的第一個字母條款。我還在字符類中添加了一個連字符("-"),因爲它們在域名中是有效的(並且不是非常罕見)。

此外,並非所有的電子郵件地址在瑣碎"[email protected]"形式和Internationalized Domain Names (or IDN)可以在本地以非punycode形式時不傳輸(例如不以限制上下文中使用)來表示,但這是另一個話題。 (由於國際化域名,將[a-zA-Z0-9-]*替換爲[^.]*可能更合適,無需進一步說明。)

+0

謝謝你 - 非常感謝:) –

0

你可以像這樣爲好,如果沒有,它至少是很容易讀取和修改:

$email = $row->email; 
$atPos = strpos($email, "@"); 
preg_match('/(\..*?)$/', $email, $topDomain, PREG_OFFSET_CAPTURE); 
$emailLength = strlen($email); 

$hiddenEmail = $email[0] . 
       str_repeat('~', $atPos-1) . 
       "@" . 
       $email[$atPos + 1] . 
       str_repeat('~', $topDomain[1][1]-$atPos-2) . 
       $topDomain[1][0]; 
相關問題