【问题标题】:Regex replace, email address from inside email body正则表达式替换,电子邮件正文中的电子邮件地址
【发布时间】:2015-02-10 01:14:21
【问题描述】:

我有(很多)电子邮件,其中包含诸如 之类的地址。

我希望删除邮件正文中的 ,但仅限于里面有和 @ 的地方(正文中也有 HTML 标签,必须保留)。

我可以用这个正则表达式匹配地址:

^<.[^@]+.@.[^@]+.>$

,但是如何仅用地址而不是 替换它?

【问题讨论】:

  • 嗯,字符串是字符数组...
  • 是否有空格,或者您是否只是使用这些空格将尖括号与电子邮件清楚地分开?也就是说,电子邮件地址是像这样:&lt; asd@somewhere.co &gt; 还是像这样:&lt;asd@somewhere.co&gt;?如果是后者,它应该就像在两个由单词边界分隔的尖括号之间搜索 @ 符号一样简单。

标签: php regex email


【解决方案1】:

应该这样做...

<?php
$string = '< asd@somewhere.co >';
echo preg_replace('~<\s*(.*?@.*?)\s*>~', '$1', $string);
?>

搜索“大于”,可选的前导空格,每个字符直到第一个 @,然后每个字符直到第一个“小于”,可选的尾随空格。

【讨论】:

    【解决方案2】:

    要搜索您想要使用的地址,如下所示:

    (?:<)([^>]*@[^>]*)(?:>)
    

    Please see Regex 101 here. 我在尖括号中使用了非捕获组,所以实际上只有它们之间的部分会被捕获(而且我没有为电子邮件使用特别好的正则表达式,但这应该很容易调整)。

    您应该能够将上述内容与preg_replace_all()$1 反向引用一起使用。

    【讨论】:

    • 没有preg_replace_all()这样的东西
    【解决方案3】:

    我有(很多)电子邮件,其中包含 之类的地址 在体内。

    我希望从电子邮件正文中删除 ,但仅限于那里 is 和 @ inside(body 中也有 HTML 标签,必须 留)。

    简单。这个概念被称为切片。

    $email = '<asd@somewhere.co>';
    
    
    if( strpos( $email, '@' ) ) {
    
        $new_email = substr( $email, 1, strlen($email)-2 );
        echo $new_email;
    }
    

    输出:asd@somewhere.co

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2011-10-14
      相关资源
      最近更新 更多