正则表达式:替换电子邮件地址,扭曲

时间:2010-09-23 07:11:22

标签: php regex email

我开发了一个wordpress插件,可以查看一堆html并检测任何电子邮件地址,用不可收获的html标记替换它们(通过javascript重新发送为电子邮件以获得更好的可用性)。

例如,函数接收:

$content = "Hello john@doe.com. How are you today?";

和输出:

$content = "Hello <span class="email">john(replace this parenthesis by @)example.com</span>. How are you today?";

我的功能正常,但我现在想要提供一个选项来指定可读的电子邮件应该是什么样的。所以如果函数收到:

$content = "Hello john@doe.com(John Doe). How are you today?";

新输出将是:

$content = "Hello <span class="email" title="John Doe">john(replace this parenthesis by @)example.com</span>. How are you today?";

因此正则表达式应该查找附加的括号,如果找到,请取内部并添加html title属性,删除括号,然后解析电子邮件。

由于功能的可选性,我对于如何实现它几乎一无所知(意思是:那些括号并​​不总是存在)。

任何指针都会有所帮助,这是我当前的代码:

function pep_replace_excerpt($content) {
     $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 class="email" title="$4">$1(replace this parenthesis by @)$2.$3</span>', $the_addrs[$a]);
        }
        $cc = str_replace($the_addrs, $repaddr, $content);
        return $cc;
}

1 个答案:

答案 0 :(得分:2)

简单选项可能是在电子邮件之后使用strpos检查是否存在括号,然后使用正则表达式查找电子邮件后第一次出现((.+?))

另一个选项是将((.+?))?添加到正则表达式中,最后一个问号将使该组成为可选项。

然后傻瓜代码看起来像:

function pep_replace_excerpt($content) {
     $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++) {
            if(count($the_addrs[$i]) == 4)
                $repaddr[$a] = preg_replace($addr_pattern, '$1(replace this parenthesis by @)$2.$3', $the_addrs[$a]);
            else
                $repaddr[$a] = preg_replace($addr_pattern, '$1(replace this parenthesis by @)$2.$3', $the_addrs[$a]);
        }
        $cc = str_replace($the_addrs, $repaddr, $content);
        return $cc;
}