Reguljärt uttryck för att spamsäkra epostadresser i en sträng
25 augusti, 2010 av Victor SchelinI en tid då spam drabbar även de bästa tekniknördarna, är behovet för att spamsäkra webbsystem stort. Till ett av våra webbprojekt var det nödvändigt att alla texter skulle vara helt 100% spamfria (dvs. inga referenser till epostadresser fick förekomma överhuvudtaget, absolut inga ”mailto:namn@företag.com”). Efter en stunds knep och knåp kom vi fram till en bra metod för att göra om epostadresser till spamfria sådana i PHP med hjälp av reguljära uttryck och autogenererade bilder.
/**
* Replace all email addresses with image links
* @param $content the string content to replace
* @return string with all email addresses replaced by generated images
*/
function get_email_spam_secured_text($content)
{
return preg_replace("/([A-Za-z0-9._%-]+)\@([A-Za-z0-9._%-]+)/","<img src=\"generate_email_image.php?prefix=$1&suffix=$2\" alt="" />", $content);
}
Det reguljära uttrycket hittar alla förekomster av typen text@mer.text, dvs. text följt av ett @ följt av mer text (inkl. punkter eller liknande). Sedan ersätter vi dessa med en <img> tagg där källan är en fil som genererar vår bild och där parametrarna är det som står innan och efter @. Vår bildfil tar dessa parametrar, sätter ihop de till en epostadress igen och spottar ut en bildström.
Nackdelen med denna lösning är att vi inte kan klicka på adressen för att snabbt få upp vårt epostprogram och skicka ett email till personen, och vi kan inte heller markera adressen. Därför lämpar sig denna lösning då epostadresserna är korta och enkla, som exempelvis ‘namn@företag.se’, och då det helt enkelt är väldigt viktigt att företaget inte får någon spam.
Andra vanliga lösningar är att t.ex. skriva ‘namn [at] företag.se’, men denna metod är inte alls 100% spamsäker samtidigt som det inte här heller går att markera texten och klistra in i ett epostprogram etc.
Filen generate_email_image.php innehåller kod för att göra om en textsträng till en bild. Nedan följer en kodsnutt för hur denna kan se ut (förenklad variant):
header("Content-type: image/png");
$prefix = $_GET['prefix'];
$suffix = $_GET['suffix'];
$email = $prefix . '@' . $suffix;
$length = (strlen($email)*8);
$im = @ImageCreate ($length, 20) or die ("Error");
$bg = imagecolorallocate($im, 0, 0, 0);
imagecolortransparent($im, $bg);
$text_color = ImageColorAllocate ($im, 0,0,0);
imagestring($im, 2,0,2, $email, $text_color);
imagepng ($im);


augusti 25th, 2010 klockan 09:49
En stor ”like” till bilden!