2012-02-07 61 views
3

我正在嘗試在我的網站中實現類似功能,並希望顯示如下所示的電子郵件。在SQL查詢中用'*'替換電子郵件地址中的某些字符

enter image description here

下面是MySQL的代碼我已經寫了,它是爲我所測試的情況下工作正常。但是想和你們覈對一下我們是否有更好的解決方案。

SELECT CONCAT(RPAD(CONCAT(RPAD(firstletter, firstpartlength - 2, '*'), 
        beforedomain), (
          secondpartlength - Length(afterdot) + 
          firstpartlength), 
        '*'), afterdot) hiddenemail 
FROM (SELECT SUBSTRING(email, 1, 1)        firstletter, 
       SUBSTRING(email, INSTR(email, '@') - 1, 3)   beforedomain, 
       SUBSTR(SUBSTRING(email, INSTR(email, '@')), 
       INSTR(SUBSTRING(email, 
        INSTR(email, '@')), '.')) 
         afterdot, 
       LENGTH(SUBSTRING(email, 1, INSTR(email, '@') - 1)) 
       firstpartlength, 
       LENGTH(SUBSTRING(email, INSTR(email, '@') + 1)) 
       secondpartlength 
     FROM test_table) a 

感謝您的幫助

問候 基蘭

+1

我不知道您的實際情況,但實施服務器端腳本解決方案可能會更好。例如,如果您正在從PHP腳本執行此SQL,則PHP將成爲將電子郵件的部分更改爲星號的更好選擇。 – 2012-02-07 15:26:21

+0

謝謝大衛。是的,這是真的。我正在使用PHP。任何已經可用的快速腳本?或者我可以自己寫一個... – Bujji 2012-02-07 15:31:07

+1

考慮像[email protected]這樣的電子郵件 - 搜索最後一個點可能更合適。我會把這種格式留在代碼中,而不是個人數據庫中。 – voidengine 2012-02-07 15:31:46

回答

1

正如我在評論說,我會推薦這樣一個基於PHP的解決方案:

<?php 
$email = '[email protected]'; 

$beforeAt=explode("@",$email); 
$beforeAt=$beforeAt[0]; 
$asterisks=str_repeat("*",strlen($beforeAt)-2); 
$beforeAt=$beforeAt{0}.$asterisks.substr($beforeAt,-1); 
$domain=explode("@",$email); 
$domain=explode(".",$domain[1]); 
$extension=$domain[count($domain)-1]; 
$domain=implode(".",$domain); 
$domain=substr($domain,0,-1*strlen($extension)-1); 
$asterisks=str_repeat("*",strlen($domain)-1); 
$email=$beforeAt."@".substr($domain,0,1).$asterisks.".".$extension; 

echo $email; 
?> 
+0

感謝您的快速解決方案。有沒有什麼辦法可以像y*******[email protected]***.ss(@之前的一個字符和@之後的一個字符)。現在,它是作爲y********@****.ss – Bujji 2012-02-07 15:44:52

+0

解決方案已更新。 – 2012-02-07 16:05:49

+0

謝謝大衛但是@ @之後的人物還沒來。它仍然是y********[email protected]****.ss而不是y********[email protected]***.ss。我試圖修改你的初始解決方案..從part2獲取最後一個字符的子字符串和從第5部分獲取第一個字符,但仍然檢查它.. – Bujji 2012-02-07 16:10:45

2

更簡單的解決方案,而多選:

SELECT 
CONCAT(
    SUBSTR(`email`,1,1), 
    REPEAT('*',LOCATE('@',`email`)-3), 
    SUBSTR(`email`,LOCATE('@',`email`)-1,3), 
    REPEAT('*',LENGTH(`email`)-LOCATE('.',REVERSE(`email`))-LOCATE('@',`email`)-1), 
    SUBSTR(`email`,LENGTH(`email`)-LOCATE('.',REVERSE(`email`))) 
) 
FROM `accounts`; 
相關問題