Solar e-mail helper that stops spammers
August 19th, 2009 by Ray in Cookbook, PHP/MySQL, Solar | Tags: Cookbook, php, Solar | No CommentsTonight I created a helper for Solar that encodes mailto href addresses so SPAMers that scrape HTML pages will never get your addresses.
To use this helper, just do the following in your views/layouts:
echo $this->email('someuser@somehost.com', 'Ray');
Here is the helper code:
<?php
/**
* Generates an encoded mailto href to stop spammers from scrapping email
* addresses from your web pages. This code is based on the PHP example
* from http://rumkin.com/tools/mailto_encoder/
*
* @category Whitebox
* @package Whitebox_View
* @author Raymond J. Kolbe <rkolbe@gmail.com>
*/
class Whitebox_View_Helper_Email extends Solar_View_Helper {
/**
* The encoded email address.
*
* @var string
*/
protected $_encoded_string = '';
/**
* The encoded index used to decode $_encoded_string/
*
* @var string
*/
protected $_encoded_indexes = '';
/**
* Generates an encoded mailto href to stop spammers from
* scrapping email addresses off your web pages. Returns
* an inline javascript code block that allows web browser
* to read the mailto href.
*
* If javascript is disabled in the web browser, only the
* link text is shown to the user.
*
* @param string $spec The email address (e.g. rkolbe@gmail.com)
* @param string $text Href
* @param array $attribs An array of href attributes
* @return string An inline string of javascript to handle the
* encoded mailto href
*/
public function email($spec, $text = null, $attribs = null) {
// escape the email address
$spec = $this->_view->escape($spec);
// build attribs, after dropping any 'href' attrib
$attribs = (array) $attribs;
unset($attribs['href']);
$attribs = $this->_view->attribs($attribs);
$this->_obfuscate("<a href=\"mailto:$spec\"$attribs>$text</a>");
$script = $this->_getScript();
$script .= '<noscript>'.$text.'</noscript>';
return $script;
}
/**
* Takes a given href and obfuscates it.
*
* @param string $link A full mailto href
* @return void
*/
protected function _obfuscate($link) {
$scrambled_chars = str_shuffle($link);
$this->_encoded_string = $this->_escapeString($scrambled_chars);
$string_indexes = '';
for ($i = 0; $i < strlen($link); $i++) {
$index = strpos($scrambled_chars, substr($link, $i, 1)) + 48;
$string_indexes .= chr($index);
}
$this->_encoded_indexes = $this->_escapeString($string_indexes);
}
/**
* Returns a block of javascript used to decode the mailto href.
* This only allows web browsers to see the mailto address.
*
* @param void
* @return string An inline block of javascript
*/
protected function _getScript() {
return $this->_view->scriptInline('<!--
chars = "'.$this->_encoded_string.'";
indexes = "'.$this->_encoded_indexes.'";
href = "";
for(j = 0; j < indexes.length; j++){
href += chars.charAt(indexes.charCodeAt(j) - 48);
}
document.write(href);
// -->');
}
/**
* Prepares (escapes) a string for javascript.
*
* @param string $string The string to escape
* @return string The escaped string
*/
protected function _escapeString($string) {
$string = str_replace("\\", "\\\\", $string);
$string = str_replace("\"", "\\\"", $string);
return $string;
}
}