使用PHP将电子邮件文本转换为链接

时间:2013-04-10 14:46:13

标签: php mailto

根据我在此处回答的问题(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() ); ?>

6 个答案:

答案 0 :(得分:2)

  1. str_replace()不使用正则表达式,使用preg_replace()重写。
  2. 为第一个匹配的表达式添加了分隔符。
  3. 修正了从$1$2的替换。
  4. 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);