planetemails
asked on
Mask Email Address (need better solution)
Hi,
below are (working) codes to display masked email address which I'm looking for a better solution.
Current results:
john_doe@yahoo.com > displayed as > john_xxx@yahoo.com
mail.manager@gmail.com > displayed as > mail.manaxxx@gmail.com
The codes are so simple .. actually I'm looking for better solution like this:
john_doe@yahoo.com > should display as > jxxxxxxe@yxxxo.com > or better > jxxx_xxe@yxxxo.xxx
mail.manager@gmail.com > should display as > mxxxxxxxxxxr@gxxxl.com > or better > mxxx.xxxxxxr@gxxxl.xxx
can anyone help me in modifying the codes to suits what I'm looking for ... Thanks in advance.
below are (working) codes to display masked email address which I'm looking for a better solution.
Current results:
john_doe@yahoo.com > displayed as > john_xxx@yahoo.com
mail.manager@gmail.com > displayed as > mail.manaxxx@gmail.com
The codes are so simple .. actually I'm looking for better solution like this:
john_doe@yahoo.com > should display as > jxxxxxxe@yxxxo.com > or better > jxxx_xxe@yxxxo.xxx
mail.manager@gmail.com > should display as > mxxxxxxxxxxr@gxxxl.com > or better > mxxx.xxxxxxr@gxxxl.xxx
can anyone help me in modifying the codes to suits what I'm looking for ... Thanks in advance.
$active = "yes";
if (ereg("^(.+)@(.+)\\.(.+)$", $row['email'], $arr))
$total = strlen($arr['1']);
$digit = ($total - 10 );
if ( $row['mask_email'] == $active ) { $digitall = "$digit"; }
else
{ $digitall = "3"; }
if (ereg("^(.+)@(.+)\\.(.+)$", $row['email'], $arr)) {
$real = strlen($arr['1']);
$sub_real = substr($arr['1'],0,$digitall);
$email2 = strlen($sub_real);
echo ($sub_real);
while($email2 < $real)
{ print("x");
$email2++;
}
echo "@";
echo $arr['2'].".".$arr['3'];
}
ASKER
Ok, I'll try to adapt your codes to mine .. but having test it, yes it masks mail.manager@gmail.com to mxxx.xxxxxxr@gxxxx.xxm BUT if the data :
mail_manager@gmail.com it displays mxxxxxxxxxxr@gxxxx.xxm (no "_" displayed)
Perhaps you can modify the > $name=$name1.$name2.$name3 ;
so it can recognize email symbols (. and _ and -)
I'll let you know later how's the work from my side. Thanks.
PS: The emails are taken from database from users' email so there'll be a lot of email variations format.
mail_manager@gmail.com it displays mxxxxxxxxxxr@gxxxx.xxm (no "_" displayed)
Perhaps you can modify the > $name=$name1.$name2.$name3
so it can recognize email symbols (. and _ and -)
I'll let you know later how's the work from my side. Thanks.
PS: The emails are taken from database from users' email so there'll be a lot of email variations format.
Outputs ...
Before : <john_doe@yahoo.com> After : <jxxn_dxe@yxxxo.cxm>
Before : <mail.manager@gmail.com> After : <mxxl.mxxxxxr@gxxxl.cxm>
Before : <a@gmail.com> After : <a@gxxxl.cxm>
Before : <ab@gmail.com> After : <ab@gxxxl.cxm>
Before : <a.b.c@gmail.com> After : <a.b.c@gxxxl.cxm>
Before : <a..b...c@gmail.com> After : <a..b...c@gxxxl.cxm>
Before : <a_bb__ccc___dddd@god_has_ left_the_b uilding.co m> After : <a_bb__cxc___dxxd@gxd_hxs_ lxxt_txe_b xxxxxxg.cx m>
Before : <john_doe@yahoo.com> After : <jxxn_dxe@yxxxo.cxm>
Before : <mail.manager@gmail.com> After : <mxxl.mxxxxxr@gxxxl.cxm>
Before : <a@gmail.com> After : <a@gxxxl.cxm>
Before : <ab@gmail.com> After : <ab@gxxxl.cxm>
Before : <a.b.c@gmail.com> After : <a.b.c@gxxxl.cxm>
Before : <a..b...c@gmail.com> After : <a..b...c@gxxxl.cxm>
Before : <a_bb__ccc___dddd@god_has_
<?php
$a_EmailAddresses = array
(
'john_doe@yahoo.com',
'mail.manager@gmail.com',
'a@gmail.com',
'ab@gmail.com',
'a.b.c@gmail.com',
'a..b...c@gmail.com',
'a_bb__ccc___dddd@god_has_left_the_building.com',
);
function MaskEmail($s_Email)
{
// Split username and domain
$a_EmailParts = explode('@', $s_Email);
// Split each email part on any odd symbols.
foreach($a_EmailParts as $i_EmailPart => $s_EmailPart)
{
// Store the split part on itself as we no longer need the
$a_EmailParts[$i_EmailPart] = preg_split('/[^a-z\d]/sim', $s_EmailPart);
}
// Initialize masked email address.
$s_MaskedEmail = '';
// Reconstitute the masked email address.
foreach($a_EmailParts as $i_EmailPart => $a_EmailSubParts)
{
foreach($a_EmailSubParts as $i_EmailSubPart => $s_EmailSubPart)
{
// use the length of the sub part to determine action.
switch(strlen($s_EmailSubPart))
{
case 0 :
$s_MaskedEmail .= substr($s_Email, strlen($s_MaskedEmail), 1);
break ;
case 1 :
case 2 :
$s_MaskedEmail .= $s_EmailSubPart . substr($s_Email, strlen($s_EmailSubPart) + strlen($s_MaskedEmail), 1);
break;
default :
$s_MaskedEmail .= substr($s_EmailSubPart, 0, 1) . str_repeat('x', strlen($s_EmailSubPart) - 2) . substr($s_EmailSubPart, -1) . substr($s_Email, strlen($s_EmailSubPart) + strlen($s_MaskedEmail), 1);
}
}
}
// Return the result.
return $s_MaskedEmail;
}
foreach($a_EmailAddresses as $s_Email)
{
echo 'Before : <', $s_Email, '> After : <', MaskEmail($s_Email), '>', PHP_EOL;
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
What do you want to achiev? Protect crawlers to collect email-addresses or users from viewing the addresses at all?
ASKER
@hernst42
I tried to modify a script and would like to widen its 'mask email' function as above.
So, from the admin panel. he can choose to ... Mask Email: YES or NO
As general, I guess it's to protect users to view other user's email.
-------------------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- --------
@RQuadling
I think your codes need a bit modification as it's tested working only if I do this:
foreach($a_EmailAddresses as $s_Email)
{
echo MaskEmail($s_Email); // correct but all emails listed in one line
//echo 'Before : <', $s_Email, '> After : <', MaskEmail($s_Email), '>', PHP_EOL;
}
The masking function is as great as what I'm looking for .. :)
Also, to suit what I'm looking for, can you please modify the input for not arraying emails (just input for a single email) .. I mean like:
$a_EmailAddresses = john_doe@yahoo.com;
I tried as above and of course the script wont works ... :(
Also, I think better if adding 'striptolower' (I dunno where to add it) where it will convert the email to ONLY using lower case letters, rite? Please help me on this too.
Next I'll try to adapt it with my codes and hopefully I can get it working :) more guide please ...
I tried to modify a script and would like to widen its 'mask email' function as above.
So, from the admin panel. he can choose to ... Mask Email: YES or NO
As general, I guess it's to protect users to view other user's email.
--------------------------
@RQuadling
I think your codes need a bit modification as it's tested working only if I do this:
foreach($a_EmailAddresses as $s_Email)
{
echo MaskEmail($s_Email); // correct but all emails listed in one line
//echo 'Before : <', $s_Email, '> After : <', MaskEmail($s_Email), '>', PHP_EOL;
}
The masking function is as great as what I'm looking for .. :)
Also, to suit what I'm looking for, can you please modify the input for not arraying emails (just input for a single email) .. I mean like:
$a_EmailAddresses = john_doe@yahoo.com;
I tried as above and of course the script wont works ... :(
Also, I think better if adding 'striptolower' (I dunno where to add it) where it will convert the email to ONLY using lower case letters, rite? Please help me on this too.
Next I'll try to adapt it with my codes and hopefully I can get it working :) more guide please ...
ASKER
CORRECTION:
no problem on the array, bro :) I tried it working by:
$a_EmailAddresses = array
(
$row['email'],
);
.....
foreach($a_EmailAddresses as $s_Email)
{
echo "<b><i>";
echo MaskEmail($s_Email);
echo "</b></i>";
}
So, perhaps you can help in adding the 'striptolower' and perhaps also smoothen the codes .. :) ... cos I wonder why the codes still working even without PHP_EOL;
no problem on the array, bro :) I tried it working by:
$a_EmailAddresses = array
(
$row['email'],
);
.....
foreach($a_EmailAddresses as $s_Email)
{
echo "<b><i>";
echo MaskEmail($s_Email);
echo "</b></i>";
}
So, perhaps you can help in adding the 'striptolower' and perhaps also smoothen the codes .. :) ... cos I wonder why the codes still working even without PHP_EOL;
Only the actual function is important, the other bits are just to prove the function works.
The code is written on PHP5, so you may have to use . rather than , in the echo statement.
PHP_EOL is the way of saying "/n" or "/r/n" or "/r" depending on your OS (and may not be available in PHP4).
So, to use the function, you just supply the email.
e.g.
echo MaskEmail($s_Your_Email_Va riable_Nam e_Goes_Her e);
how ever you need to use it.
Only the function is important...
The code is written on PHP5, so you may have to use . rather than , in the echo statement.
PHP_EOL is the way of saying "/n" or "/r/n" or "/r" depending on your OS (and may not be available in PHP4).
So, to use the function, you just supply the email.
e.g.
echo MaskEmail($s_Your_Email_Va
how ever you need to use it.
Only the function is important...
Or even ...
$s_MaskedEmail = MaskEmail($s_UnmaskedEmail );
now you can use $s_MaskedEmail as you see fit.
$s_MaskedEmail = MaskEmail($s_UnmaskedEmail
now you can use $s_MaskedEmail as you see fit.
ASKER
hmmm ... I c .. php5 .. something that I havent really aware of .. :(
Anyway. tested working on PHP 4.4.4 .. Nice solution bro bro ...
Thanks a loT.
Anyway. tested working on PHP 4.4.4 .. Nice solution bro bro ...
Thanks a loT.
ASKER
Thanks bro ...
It mask mail.manager@gmail.com to mxxx.xxxxxxr@gxxxx.xxm
Open in new window