encodeText($mail1) . '@' . $this->encodeText($mail2); return $encMail; } /** * Obfuscates Email (works without JS!) to avoid spam bots to get it * * @param string $mail Email to encode * @param string|null $text Text, ptional (if none is given, email will be text as well) * @param array $params ?subject=y&body=y to be attached to "mailto:xyz" * @param array $attr HTML tag attributes * @return string Save string with JS generated link around email (and non JS fallback) */ public function encodeEmailUrl($mail, $text = null, array $params = [], array $attr = []) { if (empty($class)) { $class = 'email'; } $defaults = [ 'title' => __d('tools', 'for use in an external mail client'), 'class' => 'email', 'escape' => false ]; if (empty($text)) { $text = $this->encodeEmail($mail); } $encMail = 'mailto:' . $mail; // additionally there could be a span tag in between: email@web.de $querystring = ''; foreach ($params as $key => $val) { if ($querystring) { $querystring .= "&$key=" . rawurlencode($val); } else { $querystring = "?$key=" . rawurlencode($val); } } $attr = array_merge($defaults, $attr); $xmail = $this->Html->link('', $encMail . $querystring, $attr); $xmail1 = mb_substr($xmail, 0, count($xmail) - 5); $xmail2 = mb_substr($xmail, -4, 4); $len = mb_strlen($xmail1); $i = 0; $par = []; while ($i < $len) { $c = mt_rand(2, 6); $par[] = (mb_substr($xmail1, $i, $c)); $i += $c; } $join = implode('\'+ \'', $par); return ' ' . $text . ' '; } /** * Encodes Piece of Text (without usage of JS!) to avoid spam bots to get it * * @param string $text Text to encode * @return string (randomly encoded) */ public function encodeText($text) { $encmail = ''; $length = mb_strlen($text); for ($i = 0; $i < $length; $i++) { $encMod = mt_rand(0, 2); switch ($encMod) { case 0: // None $encmail .= mb_substr($text, $i, 1); break; case 1: // Decimal $encmail .= '&#' . ord(mb_substr($text, $i, 1)) . ';'; break; case 2: // Hexadecimal $encmail .= '&#x' . dechex(ord(mb_substr($text, $i, 1))) . ';'; break; } } return $encmail; } /** * test@test.de becomes t..t@t..t.de * * @param string $mail Valid(!) email address * @return string */ public static function hideEmail($mail) { $mailParts = explode('@', $mail, 2); $domainParts = explode('.', $mailParts[1], 2); $user = mb_substr($mailParts[0], 0, 1) . '..' . mb_substr($mailParts[0], -1, 1); $domain = mb_substr($domainParts[0], 0, 1) . '..' . mb_substr($domainParts[0], -1, 1) . '.' . $domainParts[1]; return $user . '@' . $domain; } /** * Word Censoring Function * * Supply a string and an array of disallowed words and any * matched words will be converted to #### or to the replacement * word you've submitted. * * @param string $str the text string * @param array $censored the array of censored words * @param string|null $replacement the optional replacement value * @return string */ public function wordCensor($str, array $censored, $replacement = null) { if (empty($censored)) { return $str; } $str = ' ' . $str . ' '; // \w, \b and a few others do not match on a unicode character // set for performance reasons. As a result words like ..ber // will not match on a word boundary. Instead, we'll assume that // a bad word will be bookended by any of these characters. $delim = '[-_\'\"`() {}<>\[\]|!?@#%&,.:;^~*+=\/ 0-9\n\r\t]'; foreach ($censored as $badword) { if ($replacement !== null) { $str = preg_replace("/({$delim})(" . str_replace('\*', '\w*?', preg_quote($badword, '/')) . ")({$delim})/i", "\\1{$replacement}\\3", $str); } else { $str = preg_replace_callback("/({$delim})(" . str_replace('\*', '\w*?', preg_quote($badword, '/')) . ")({$delim})/i", function ($matches) { return $matches[1] . str_repeat('#', strlen($matches[2])) . $matches[3]; }, $str); } } return trim($str); } }