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

使用PHP将电子邮件文本转换为链接,php,mailto,Php,Mailto,基于我在这里回答的一个问题(),我希望能够过滤输出文本中的电子邮件地址,并将这些文本电子邮件转换为“mailto”链接 下面是可以工作的PHP代码,但仅用于将一些HTML转换为其他HTML。我试着让这个函数查找电子邮件地址,并将其转换为“mailto”链接。无论出于何种原因,代码都不会转换电子邮件地址。以下是我的PHP: function text_filter($string) { $search = array('<p>__</p>', '/[a-zA-

基于我在这里回答的一个问题(),我希望能够过滤输出文本中的电子邮件地址,并将这些文本电子邮件转换为“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;
}
函数文本过滤器($string){
$search=array(“”,“/[a-zA-Z0-9.\u-]+@[a-zA-Z0-9.-]+\[a-zA-Z]{2,4}/”;
$replace=数组(“
,”); $processed_string=str_replace($search,$replace,$string); echo$processed_字符串; }
当我将此函数用于输出时,代码是这样的:

<?php text_filter( get_the_content() ); ?>

不能使用
str\u 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;
}
函数文本过滤器($string){
$search=array('\uuu

'); $replace=数组(“
”); $processed_string=str_replace($search,$replace,$string); $processed_string=preg_replace('/[a-zA-Z0-9.\-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/',''.$processed_string); echo$processed_字符串; }
有关preg更换,请参阅

  • str\u replace()
    不使用正则表达式,用
    preg\u replace()
    重写
  • 在第一个匹配表达式中添加了分隔符
  • 修复了从
    $1
    $2
    的替换
  • 函数文本过滤器($string){
    $search=array('/\\/','/([a-zA-Z0-9.\-]+@[a-zA-Z0-9.-]+\[a-zA-Z]{2,4})/');
    $replace=数组(“
    ,”); $processed_string=preg_replace($search,$replace,$string); echo$processed_字符串; }
    另一种按顺序操作的方法,以便它可以处理文本中的现有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;
    }
    
    函数html\u parse\u text($text)
    {    
    
    $text=preg_replace(“/(?这里是另一个版本,它似乎适合我。我添加了+char来处理“加寻址”(就像一些+email@address.com)

    函数替换电子邮件($text){-
    $ex=“/([a-zA-Z0-9.\+-]+@[a-zA-Z0-9.-]+\[a-zA-Z]{2,4})/”;
    preg_match_all($ex,$text,$url);
    foreach($url[0]为$k=>$v)$text=str_replace($url[0][$k],“”,$text);
    返回$text;
    }
    
    @Adam Baney-即使重复使用,也可以使用

    //电子邮件
    $str=preg_replace(“~(^ |[\s\,;\n\(])([a-zA-Z0-9.+-]+@[a-zA-Z0-9.-]+\[a-zA-Z]{2,4})~”,
    '$1',
    $str);
    //电话号码
    
    $str=preg_replace_callback('~(^ |[\s\,;\n\(]))(?我们知道函数调用的样子,给我们看看输出。编辑:事实上,我可以告诉你它不起作用,因为
    str_replace()
    无法识别正则表达式。请使用
    preg_replace()
    。谢谢你的帮助!你关于preg_替换的回答是正确的,但是,你提供的代码不起作用。电子邮件地址完全消失了。由P标记包围的2个下划线被替换为水平规则。下面Sammitch的回答非常有效!很高兴听到,没有测试reqular表达式,因此它是P很可能它不起作用;)工作得很好!我现在有另一个问题。我正在使用一个WordPress插件来混淆电子邮件地址。我必须禁用这个插件,这样上面的功能才能正常工作。有没有办法在这个代码中添加一些电子邮件混淆?非常感谢!!刚刚发现了第二个问题:如果一个邮件地址已经被加密在页面中,上述函数也将尝试转换该电子邮件。不幸的是,在电子邮件mailto链接之前添加了一些HTML代码,例如。“mail@example.com?主题=主题“>”,其中mail@example.com是一个功能齐全/可点击的mailto链接。有什么想法吗?这非常适合将电子邮件转换为“emailto”但是,如果电子邮件地址已链接,则链接不起作用。以下是输出的HTML:
    “>
    与上面的注释相同…将电子邮件转换为“emailto”链接非常有效,但是,如果电子邮件地址已链接,则此操作不起作用。以下是输出的HTML:
    ”>
    输出的HTML变得非常混乱,多次重复站点文本中的HTML链接。下面是一个屏幕截图:
    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' );
    
    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;
    }
    
    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;
    }