* @license http://www.php.net/license PHP License
* @version CVS: $Id: Crypt.php 266610 2008-09-21 16:18:57Z cweiske $
* @link http://pear.php.net/package/HTML_Crypt
*/
/**
* HTML_Crypt
*
* HTML_Crypt provides methods to encrypt text, which
* can be later be decrypted using JavaScript on the client side
*
* This is very useful to prevent spam robots collecting email
* addresses from your site, included is a method to add mailto
* links to the text being generated.
*
* The "encryption" function is basically works like ROT13,
* with the difference that the $offset setting replaces the 13.
* It is also limited to ASCII characters between 32 and 127 (included).
* Other characters will not be encrypted.
*
* a basic example to encrypt an email address
* $c = new HTML_Crypt('yourname@emailaddress.com', 8);
* $c->addMailTo();
* $c->output();
*
* @category HTML
* @package HTML_Crypt
* @author Michael Dransfield
* @license http://www.php.net/license PHP License
* @link http://pear.php.net/package/HTML_Crypt
*/
class HTML_Crypt
{
// {{{ properties
/**
* The unencrypted text
*
* @access public
* @var string
* @see setText()
*/
var $text = '';
/**
* The full javascript to be sent to the browser
*
* @access public
* @var string
* @see getScript()
*/
var $script = '';
/**
* The text encrypted - without any js
*
* @access public
* @var string
* @see cyrptText
*/
var $cryptString = '';
/**
* The number to offset the text by
*
* @access public
* @var int
*/
var $offset;
/**
* Whether or not to use JS for encryption or simple html
*
* @access public
* @var int
*/
var $useJS;
/**
* a preg expression for an offset = $offset % 95;
$this->text = $text;
$this->script = '';
$this->useJS = $JS;
$this->emailpreg = '[-_a-z0-9]+(\.[-_a-z0-9]+)*'
. '@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]{2,6}';
$this->apreg = '\<[aA]\shref=[\"\']mailto:.*\<\/[aA]\>';
}
// }}}
// {{{ setText()
/**
* Set name of the current realm
*
* @param string $text The text to be encrypted
*
* @return void
*
* @access public
*/
function setText($text)
{
$this->text = $text;
}
// }}}
// {{{ addMailTo()
/**
* Turns the text into a mailto link (make sure
* the text only contains an email).
*
* This method has an optional parameter that allows you
* to customize the email tag and tag text. To get the email
* address included, use "%email%' as template variable.
*
* @param string $template Mailto template string
*
* @return void
*
* @access public
*/
function addMailTo($template = '%email%')
{
$email = $this->text;
$this->text = str_replace('%email%', $email, $template);
}
// }}}
// {{{ cryptText()
/**
* Encrypts the text
*
* @param string $text Text to encrypt
* @param int $offset Offset to use for encryption
*
* @return string Encrypted text
* @access private
*/
function cryptText($text, $offset)
{
$enc_string = '';
$length = strlen($this->text);
for ($i=0; $i < $length; $i++) {
$current_chr = substr($this->text, $i, 1);
$num = ord($current_chr);
if ($num < 128) {
$inter = $num + $this->offset;
if ($inter > 127) {
$inter = ($inter - 32) % 95 + 32;
}
$enc_char = chr($inter);
$enc_string .= ($enc_char == '\\' ? '\\\\' : $enc_char);
} else {
$enc_string .= $current_chr;
}
}
return $enc_string;
}
// }}}
// {{{ getScript()
/**
* Returns the script html source including the function
* to decrypt it.
*
* @return string $script The javascript generated
*
* @access public
*/
function getScript()
{
if ($this->cryptString == '' && $this->text != '') {
$this->cryptString = $this->cryptText($this->text, $this->offset);
}
$letters = array(
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
);
$rnd = $letters[array_rand($letters)] . md5(time());
// the actual js (in one line to confuse)
$script = '';
$this->script = $script;
return $script;
}
// }}}
// {{{ output()
/**
* Outputs the full JS to the browser
*
* @return void
*
* @access public
*/
function output()
{
echo $this->getOutput();
}
// }}}
// {{{ getOutput()
/**
* Returns the encrypted text.
*
* @return string Encrypted text
*/
function getOutput()
{
if ($this->useJS) {
if ($this->script == '') {
$this->getScript();
}
return $this->script;
} else {
return str_replace(
array('@', '.'),
array(' ^at^ ', '-dot-'),
$this->text
);
}
}
// }}}
/**
* Starts output buffering.
*
* @return void
*/
function obStart()
{
ob_start();
}
/**
* Ends output buffering and echoes the captured text.
*
* @return void
*/
function obEnd()
{
$text = ob_get_contents();
$text = preg_replace_callback(
"/{$this->apreg}/",
array($this, '_fly'),
$text
);
ob_end_clean();
echo $text;
}
/**
* Creates a new crypt object, sets the text on it
* and returns the script in one step.
*
* @param string $text Text to crypt
*
* @return string Crypted script
*/
function _fly($text)
{
$c = new HTML_Crypt($text[0]);
$c->setText($text[0]);
return $c->getScript();
}
}
?>