2012-04-15 59 views
1

我使用這個簡單的代碼:御史電子郵件與PHP

$raw = 'text [email protected] text'; 
$raw = preg_replace('<[\w.][email protected][\w.]+>', '***@$2', $raw); 

,我應該得到的輸出,像***@li.com;而我得到***@

我無法調試它,我不知道怎麼了。


因此,解決辦法是

preg_replace('<([\w.]+)@([\w.]+)>', '***@$2', $raw); 

我不得不添加()做一團。

+2

譴責(/sɛnʃər/)是強烈反對或苛刻批評的表達。你的意思是「審查員」? – 2012-04-15 09:31:26

+0

我相信你需要使用帶括號的$ x來標記你希望以後引用的匹配,例如:''<([\ w。])+ @([\ w。])+>''然後$ 2引用第二個'([\ w。])' – Yaniro 2012-04-15 09:31:53

+0

我已經編輯它。我不是英國人,謝謝。 – cedivad 2012-04-15 09:32:12

回答

3

你需要通過添加()來創建一個組,BTW這會是$ 1:

$raw = ' [email protected] '; 
$raw = preg_replace('/[^@][email protected]([^\s]+)/', '***@$1', $raw); 

還修改+ TP [^ \ s] +所以它只「吃」電子郵件而不是之後的文本

+0

我不知道();這是一個適合我的工具(不是你的代碼,我的代碼用()。因爲我用它在文本里面寫郵件,你的代碼會grep一切,而preg_replace('<([\ w。] + )@([\ w。] +)>','*** @ $ 2',$ raw);作品 – cedivad 2012-04-15 09:36:08

1

這裏沒有正則表達式:

$raw = '[email protected]'; 
$raw = explode('@', $raw); 
array_shift($raw); 
$raw = '***@'.implode('', $raw); 
+0

只有在$ raw僅由一封電子郵件組成時纔有效;它不是,它是帶有電子郵件的文本;無論如何,無論如何感謝 – cedivad 2012-04-15 09:33:00

+1

@cedivad在這種情況下,我不確定其他示例是否有效,因爲如果您的文本在電子郵件地址後繼續,則正則表達式中的(。+)將繼續直到第一行的末尾。 – Gavriel 2012-04-15 09:36:16

+1

是的這是正確的,但沒有在你的問題中聲明。 – 2012-04-15 09:36:40

0

正則表達式對於這項任務有點矯枉過正。使用explode()函數和一點字符串連接應該就足夠了。

$pieces = explode('@', $raw); 
$raw = '***@' . $raw[count($raw) - 1]; 

通知,我訪問存儲在$raw的電子郵件地址的域部分的方式。我沒有使用$raw[1],因爲@字符實際上可以用作電子郵件地址(如果它包含引號),但實際上它有點不尋常。您可以在此處看到更多電子郵件地址示例:http://en.wikipedia.org/wiki/Email_address#Valid_email_addresses

+0

抱歉,因爲不清楚問題,下次我會讓你這樣的人不花時間因爲沒有我的錯誤$ raw由普通文本*和*電子郵件組成,因此爆炸將無法工作。 – cedivad 2012-04-15 09:40:40

0

您也可以使用strstr()函數。也可以用真正的參數來獲取針前的部分並計算長度並用asterix填充。

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

$len = strlen(strstr($email, '@', true)); 
$domain = strstr($email, '@'); 

echo str_repeat('*',$len).$domain; // prints ****@example.com 
?>