正则表达式检测普通电子邮件和mailto:链接电子邮件

时间:2011-02-21 16:45:43

标签: php regex email wordpress-plugin email-spam

我的用户使用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重建一个正确的可点击的mailto:链接以启用javascript的设置,找到任一格式并使它们成为spamproof。这是我遇到问题的检测部分。

以下作品适用于普通电子邮件。我如何调整它以检测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插件:Pixeline's Email protector。获奖答案的作者将在插件代码,描述和更改日志中轻易记入。

2 个答案:

答案 0 :(得分:1)

最好使用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();

答案 1 :(得分:0)

(<a href="mailto:|)([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})(">.+?</a>|)

这应匹配所有变体,然后替换为$ 2