Php 从字符串中删除电子邮件地址

Php 从字符串中删除电子邮件地址,php,Php,我有一段 @test@gmail.com @test1@gmail.comLorem Ipsum只是一个虚拟文本 印刷和排版业。Lorem Ipsum一直是 行业标准的虚拟文本自16世纪以来,当一个未知的 印刷工拿起一个铅字厨房,把它翻成一个铅字样本 书。它不仅存活了五个世纪,而且还跨越了 电子排版,基本保持不变。是的 20世纪60年代,随着Letraset床单的发行而流行起来 包含Lorem Ipsum段落,最近使用桌面 像Aldus PageMaker这样的发布软件 所以我想从这一段中提取电

我有一段

@test@gmail.com @test1@gmail.comLorem Ipsum只是一个虚拟文本 印刷和排版业。Lorem Ipsum一直是 行业标准的虚拟文本自16世纪以来,当一个未知的 印刷工拿起一个铅字厨房,把它翻成一个铅字样本 书。它不仅存活了五个世纪,而且还跨越了 电子排版,基本保持不变。是的 20世纪60年代,随着Letraset床单的发行而流行起来 包含Lorem Ipsum段落,最近使用桌面 像Aldus PageMaker这样的发布软件

所以我想从这一段中提取电子邮件,并将电子邮件发送给提取的用户,而这一段的其余部分作为消息。所以我提取电子邮件并发送消息,但我的问题是,这一段仍然有电子邮件。 我做了以下几件事

 $pattern = '/[a-z0-9_\-\+\.]+@[a-z0-9\-]+\.([a-z]{2,4})(?:\.[a-z]{2})?/i';
    preg_match_all($pattern, $comment, $matches);
    $email=implode("\n", $matches[0]);
  
    str_replace($email, '', $comment);
预期的消息正文=

Lorem Ipsum只是印刷和排版行业的虚拟文本。自16世纪以来,Lorem Ipsum一直是行业标准的虚拟文本,当时一位不知名的印刷商拿起一个打印工具,将其拼凑成一本打印样本书。它不仅存活了五个世纪,而且还跨越到电子排版,基本上保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表单的发布而流行,最近又随着Aldus PageMaker等桌面出版软件的发布而流行


我建议像这样分解段落,检查每个元素是否包含
@
,并将其远程放到
$arr\u email
中。我不使用正则表达式

$my_paragraph =  "@test@gmail.com @test1@gmail.com  Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker"
$arr_email = [];
$arr_message = explode(" ", $my_paragraph);

foreach($arr_message as $key=>value) {

if(strpos($value, "@")  !== FALSE) {
  array_push($arr_email, $value);
  unset($arr_message[$key];
}

$my_paragraph = implode(" ", $arr_message);

以下是您可以执行的潜在工作流程:

  • 使用正则表达式查找所有电子邮件地址
  • 将找到的所有电子邮件地址替换为空白

  • 如果电子邮件的前缀总是@符号,则可以使用此正则表达式。无论电子邮件是在段落开头还是其他地方:

    $matches = preg_match("/@([a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+)/", $paragraph);
    
    找到的电子邮件将在结果匹配数组中可用:

    $emails = $matches[1];
    
    然后你可以做一些
    str\u替换
    magic。不太为人所知的是,
    str\u replace
    也接受数组来同时执行多个替换。因此,通过传递所有电子邮件和长度相等的替换数组,所有电子邮件都可以一次性被替换。通过故意使用
    $matches[0]
    来搜索,我们还考虑在替换操作期间使用前缀@符号

    $replacements = array_fill(0, count($emails), '');
    $parsedParagraph = str_replace($matches[0], $replacements, $paragraph);
    
    之后,我们将进行一些清理,以删除两个剩余空间:

    $parsedParagraph = preg_replace('/\s\s+/', ' ', $parsedParagraph);
    

    首先从字符串中提取电子邮件地址,然后替换所需内容。

    $pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';
    preg_match_all($pattern, $string, $matches);
    $str = str_replace($matches[0], '', $string);
    $str = str_replace('@', '', $str);
    echo $str;
    

    为什么要用换行符内爆找到的电子邮件地址,然后尝试替换?这只有在你的输入文本包含这些电子邮件并以换行符分隔的情况下才有意义。您的示例输入数据看起来与实际不一样。@CBroe听起来像是答案,而不是注释。:)电子邮件地址是否总是在段落的前面?我担心您的示例文本可能无法准确反映实际项目文本的挑战。电子邮件地址是否总是跟在
    @
    后面?你想删除这个主角吗?你说的“那个段落还有电子邮件”是什么意思?为什么这个问题有两张赞成票?我觉得它的解释不太清楚,而且似乎有点生疏。@mickmackusa为什么?爆炸是在“”上进行的,因此将提取电子邮件@test@gmail.com“和”@test1@gmail.com“。我通常不支持这个答案,因为它对什么是电子邮件地址和什么不是电子邮件地址都没有深刻的认识。@mickmackusa我试图帮助编写代码,以提取问题的要求。”。如果他愿意,他可以添加电子邮件验证而不是strpo。我来这里是为了提供提示,而不是做所有没有被要求的事情,比如电子邮件验证。没有怨恨。
    \s\s+
    不精致。有一种更好的方式来表达
    [a-zA-Z0-9]
    。这个问题似乎是
    preg\u replace\u callback()
    的一个很好的候选问题。请编辑并解释这里发生了什么,解释您如何解决问题。仅代码的答案在堆栈溢出方面价值很低,因为它们在授权/教育OP和数千名未来研究人员方面做得很差。
    $pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';
    preg_match_all($pattern, $string, $matches);
    $str = str_replace($matches[0], '', $string);
    $str = str_replace('@', '', $str);
    echo $str;