我开发了一个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;
}
答案 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;
}