]*>.*?#is', function ($m) use (&$placeholders) { $key = '%%RAIJU_SKIP_' . count($placeholders) . '%%'; $placeholders[$key] = $m[0]; return $key; }, $html); $emailPattern = '[A-Z0-9._%+\-]+@[A-Z0-9.\-]+\.[A-Z]{2,}'; $html = preg_replace_callback('#]*?)\bhref=(["\'])mailto:([^"\']+)\2([^>]*)>(.*?)#is', function ($m) { $before = $m[1]; $quote = $m[2]; $mailto = html_entity_decode($m[3], ENT_QUOTES, 'UTF-8'); $after = $m[4]; $label = $m[5]; $parts = explode('?', $mailto, 2); $email = rawurldecode($parts[0]); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { return $m[0]; } $query = isset($parts[1]) ? '?' . $parts[1] : ''; $attrs = preg_replace('#\s*href=' . preg_quote($quote, '#') . 'mailto:[^"\']+' . preg_quote($quote, '#') . '#i', '', $before . $after); $fallback = preg_match('/^\s*' . preg_quote(htmlspecialchars($email, ENT_QUOTES, 'UTF-8'), '/') . '\s*$/i', trim($label)) ? raijuEmailFallbackText($email) : $label; return '' . $fallback . ''; }, $html); $html = preg_replace_callback('/(?' . raijuEmailFallbackText($email) . ''; }, $html); if (!empty($placeholders)) { $html = strtr($html, $placeholders); } return $html; } function raijuStartEmailObfuscation(): void { static $started = false; if ($started || raijuEmailObfuscatorIsAdmin() || !raijuEmailObfuscationEnabled()) { return; } $started = true; ob_start('raijuEmailObfuscateHtml'); }