根据我在此处回答的问题(Use PHP to Replace HTML with HTML),我希望能够过滤电子邮件地址的输出文本,并将这些文本电子邮件转换为“mailto”链接。
这是可用的PHP代码,但仅用于将某些HTML转换为其他HTML。我试图做的是让这个函数查找一个电子邮件地址,并将其转换为“mailto”链接。无论出于何种原因,代码都不会转换电子邮件地址。这是我的PHP:
function text_filter($string) {
$search = array('<p>__</p>', '/[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/');
$replace = array('<hr />', '<a href="mailto:$2">$2</a>');
$processed_string = str_replace($search, $replace, $string);
echo $processed_string;
}
当我使用此函数进行输出时,代码如下所示:
<?php text_filter( get_the_content() ); ?>
答案 0 :(得分:2)
str_replace()
不使用正则表达式,使用preg_replace()
重写。$1
到$2
的替换。
function text_filter($string) {
$search = array('/<p>__<\/p>/', '/([a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})/');
$replace = array('<hr />', '<a href="mailto:$1">$1</a>');
$processed_string = preg_replace($search, $replace, $string);
echo $processed_string;
}
答案 1 :(得分:0)
您无法使用str_replace
进行正则表达式替换。
您需要将操作分开。
function text_filter($string) {
$search = array('<p>__</p>');
$replace = array('<hr />');
$processed_string = str_replace($search, $replace, $string);
$processed_string = preg_replace('/[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/','<a href="mailto:$2">$2</a>',$processed_string);
echo $processed_string;
}
请参阅:http://www.php.net/manual/en/function.preg-replace.php更换preg。
答案 2 :(得分:0)
function obfuscate_email($content){
$pattern = '#([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.';
$pattern .= '[a-wyz][a-z](fo|g|l|m|mes|o|op|pa|ro|seum|t|u|v|z)?)#i';
$replacement = '<a href="mailto:\\1">\\1</a>';
$content = preg_replace($pattern, $replacement, $content);
return $content;
}
并添加过滤器
add_filter( 'the_content', 'obfuscate_email' );
答案 3 :(得分:0)
另一种方法是按顺序执行此操作,以便它可以与文本中的现有html链接一起使用:
function html_parse_text($text)
{
$text = preg_replace("/(?<!\")(((f|ht){1}tps?:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/",
'<a href="\\1" target=_blank>\\1</a>', $text);
$text = preg_replace("/([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/",
'\\1<a href="http://\\2" target=_blank>\\2</a>', $text);
$text = preg_replace("/(?<!\")([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})/",
'<a href="mailto:\\1" target=_blank>\\1</a>', $text);
return $text;
}
答案 4 :(得分:0)
这是另一个版本似乎对我有用。我已添加+ char来处理&#34;加上寻址&#34; (比如某些@email@address.com)
function replaceemail($text) {-
$ex = "/([a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})/";
preg_match_all($ex, $text, $url);
foreach($url[0] as $k=>$v) $text = str_replace($url[0][$k], '<a href="mailto:'.$url[0][$k].'" target="_blank" rel="nofollow">'.$url[0][$k].'</a>', $text);
return $text;
}
答案 5 :(得分:0)
@Adam Baney-这甚至可以重复工作。
// EMAILS
$str = preg_replace('~(^|[\s\.,;\n\(])([a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})~',
'$1<a href="mailto:$2">$2</a>',
$str);
// PHONE NUMBERS
$str = preg_replace_callback('~(^|[\s\.,;\n\(])(?<! )([0-9 \+\(\)]{9,})~', function($m) {
return $m[1].'<a href="tel:'.preg_replace('~[^0-9\+]~', '', $m[2]).'">'.$m[2].'</a>';
}, $str);