Регулярное выражение для обнаружения простой электронной почты и mailto: ссылка на электронную почту
Мои пользователи используют CMS для ввода предложений о работе. В этих предложениях работы иногда адрес электронной почты в простом формате (please contact job@job.com
) или в виде html mailto: link (<a href="mailto:job@job.com">jobline</a>
и еще более раздражающий <a href="mailto:job@job.com">job@job.com</a>
).
Я хотел бы создать функцию php, которая находит любой формат и делает их спам-доказательствами, создавая html-строку, которая говорит людям, что делать, и с помощью javascript восстанавливает правильную ссылку clickto: clickto для установок с поддержкой javascript. У меня проблема с обнаружением.
Следующее работает идеально для простой электронной почты. Как я могу адаптировать его для обнаружения ссылок mailto: тоже?
$addr_pattern = '/([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})(\((.+?)\))?/i';
preg_match_all($addr_pattern, $content, $addresses);
$the_addrs = $addresses[0];
for ($a = 0; $a < count($the_addrs); $a++) {
$repaddr[$a] = preg_replace($addr_pattern, '<span title="$5" class="pep-email">$1(' . $opt_val . ')$2.$3</span>', $the_addrs[$a]);
}
$cc = str_replace($the_addrs, $repaddr, $content);
PS: это для улучшения существующего плагина Wordpress: Email Protector от Pixeline. Автор победившего ответа будет зачислен в код плагинов, описание и журнал изменений.
2 ответа
Было бы лучше использовать класс domdocument для получения реальных ссылок, поскольку существует так много разных возможных способов их написания. Вы также можете использовать его с регулярным выражением для сканирования всего содержимого, чтобы заменить текст одновременно.
// The content
$content = 'The stuff from the page';
// Start the dom object
$dom = new DOMDocument();
$dom->recover = true;
$dom->substituteEntities = true;
// Feed the content to the dom object
$dom->loadHTML($content);
// Check each link
foreach ($dom->getElementsByTagName('a') as $anchor) {
// Get the href
$href = $anchor->getAttribute('href');
// Check if it's a mailto link
if (substr($href, 0, 7) == 'mailto:') {
# Do something with it
$href = 'new link href';
}
// Put it back in the link
$anchor->setAttribute('href', $href);
}
// Replace the content with the new content
$content = $dom->saveHTML();
(<a href="mailto:|)([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})(">.+?</a>|)
Это должно соответствовать всем вариантам, а затем заменить на $2