【问题标题】:Use PHP to Convert Email Text to a Link使用 PHP 将电子邮件文本转换为链接
【发布时间】:2013-04-10 14:46:12
【问题描述】:

根据我在这里回答的一个问题 (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() ); ?>

【问题讨论】:

  • 我们知道函数调用是什么样的,向我们展示输出edit:实际上,我可以告诉你它不起作用,因为str_replace() 不识别正则表达式。使用preg_replace()

标签: php mailto


【解决方案1】:
  1. str_replace() 不使用正则表达式,用preg_replace() 重写。
  2. 为第一个匹配表达式添加了分隔符。
  3. 修复了从 $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;
}

【讨论】:

  • 完美运行!我现在有另一个问题。我正在使用一个 WordPress 插件来混淆电子邮件地址。我不得不禁用这个插件,这样上面的功能才能工作。有没有办法在此代码中添加某种电子邮件混淆?非常感谢!!
  • 刚刚发现第二个问题:如果页面中已经存在 mailto 电子邮件地址,上述函数也会尝试转换该电子邮件。不幸的是,在电子邮件 mailto 链接之前添加了一些 HTML 代码,例如"mail@example.com?subject=Subject">",其中 mail@example.com 是一个功能齐全/可点击的 mailto 链接。有什么想法吗?
【解决方案2】:

@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);

【讨论】:

    【解决方案3】:

    您不能使用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_replace 的看法是正确的,但是您提供的代码不起作用。电子邮件地址完全消失了。由 P 标签包围的 2 个下划线被替换为水平线。 Sammitch 在下面的回答完美!
    • 很高兴听到,没有测试任何正则表达式,所以它可能不起作用;)
    【解决方案4】:
    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' );
    

    【讨论】:

    • 这非常适合将电子邮件转换为“emailto”链接,但是,对于已经链接的电子邮件地址,这不起作用。这是输出的 HTML:&lt;a href="mailto:&lt;a href="mailto:email@test.com"&gt;email@test.com&lt;/a&gt;"&gt;&lt;a href="mailto:email@test.com"&gt;email@test.com&lt;/a&gt;&lt;/a&gt;
    【解决方案5】:

    另一种方法是为了使它可以与文本中现有的 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;
    }
    

    【讨论】:

    • 与上述相同的评论...这非常适合将电子邮件转换为“emailto”链接,但是,对于已经链接的电子邮件地址,这不起作用。这是输出的 HTML:&lt;a href="mailto:&lt;a href="mailto:email@test.com"&gt;email@test.com&lt;/a&gt;"&gt;&lt;a href="mailto:email@test.com"&gt;email@test.com&lt;/a&gt;&lt;/a&gt;
    【解决方案6】:

    这是另一个似乎对我有用的版本。我添加了 + char 来处理“加地址”(例如 some+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;
    }
    

    【讨论】:

    • 输出的 HTML 变得非常混乱,在网站的文本中多次重复 HTML 链接。这是屏幕截图:is.gd/bnAnQU
    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 2011-08-11
    • 2011-04-22
    • 2016-12-06
    • 2013-04-26
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多