Php 从一系列模板解析传入的电子邮件内容

Php 从一系列模板解析传入的电子邮件内容,php,regex,parsing,email,Php,Regex,Parsing,Email,在一个项目中工作,需要解析传入的电子邮件,提取某些信息并存储在数据库中。我们正在使用postmarkapp提取电子邮件的正文内容,所以我们只有文本内容,但我目前有点困在如何以最有效的方式解析电子邮件上 随着时间的推移,我们将添加更多“可接受”的接收邮件格式,但首先,我们可能会收到4封常见的电子邮件,也就是说,它们将遵循相同的格式,我们要提取的信息(联系方式、id、链接、个人简历)将位于相同的位置(根据支持的格式) 我想我们会有一个界面来处理常见的任务,并且每种支持的格式都会实现这一点,但是如何获

在一个项目中工作,需要解析传入的电子邮件,提取某些信息并存储在数据库中。我们正在使用postmarkapp提取电子邮件的正文内容,所以我们只有文本内容,但我目前有点困在如何以最有效的方式解析电子邮件上

随着时间的推移,我们将添加更多“可接受”的接收邮件格式,但首先,我们可能会收到4封常见的电子邮件,也就是说,它们将遵循相同的格式,我们要提取的信息(联系方式、id、链接、个人简历)将位于相同的位置(根据支持的格式)

我想我们会有一个界面来处理常见的任务,并且每种支持的格式都会实现这一点,但是如何获取这些信息是我的难题


欢迎关于不同方法/技术的任何想法和想法,理想情况下是PHP,但如果我们需要使用其他东西,那很好。

因为它是生成电子邮件的,所以它很可能采用易于分析的格式,例如每条指令一行<代码>键=值。然后,您可以拆分第一个
=
-符号上的行,并使用它提供给您的键值对

当您无法控制传入的数据格式时,正则表达式非常适合,但是当您控制传入的数据格式时,在没有regexp的情况下更容易确保它是可解析的


如果格式太复杂,无法进行如此简单的解析,请给出一个使用该格式的文件示例,这样我可以使答案更具体。如果这不是你想问的问题的答案,那也是一样:请举例说明你想要的答案。

我开发的一个网站上有一个类似的功能。我们的用户从他们的供应商那里收到关于价格的电子邮件。他们将邮件正文复制粘贴到我们网站的文本区,然后点击一个按钮。然后我们解析文本以查找产品和价格,并将信息粘贴到数据库中

要进行解析,我们首先必须确定供应商,就像您需要确定使用了哪个模板一样。我们在文本中寻找某些字符串——通常是供应商的名称,或者是他们电子邮件中特有的一行。我们通过一个名为
getparserfortex()
的方法来实现这一点。该方法返回一个Parser对象,该对象使用
parseText()方法实现一个简单接口

每种格式都有一个解析器实现类。每个类中的
parseText()
方法负责从文本中获取数据。我们一直在寻找使这些产品变得优雅和通用的方法,但并没有找到一个真正好的方法。我们使用正则表达式的组合,将字符串拆分为更小的部分,并遍历字符串

伪代码:

$text = $_POST['emailBody'];
$parser = getParserForText($text);
$result = $parser->parseText($text);
if(count($result["errors"]) > 0)
{
    // handle errors
}
else
{
    saveToDatabase($result["prices"]);
}
我们无法控制供应商使用的格式,因此我们必须采取以下措施:

  • 将文本拆分为一个字符串数组,每行周围都有一个日期(pore_split())

  • 对于该数组中的每个元素,第一行包含日期,接下来的三到六行包含产品和价格

  • 拉出日期,然后在新行上拆分字符串

  • 对于每一行,使用正则表达式找到价格($000.0000)并将其取出

  • 修剪线条的其余部分以用作产品名称

  • 我们使用了大量的
    prey\u split()
    preg\u match\u all()
    explode()
    。虽然在我看来,这个系统并不是特别优雅或通用,但它一直非常健壮。通过在正则表达式中留下一点回旋余地,我们已经完成了一些小的格式更改,而无需更改代码。我所说的“摇摆空间”指的是:不要搜索空格,搜索任何空格。不要搜索一个美元符号和两个数字,搜索一个美元符号和任意数量的数字。诸如此类的小事

    编辑:

    几年前我问了一个问题:

    您试图解析的邮件来自网站或其他地方的单一表单,或来自任何电子邮件客户端?它们将来自几个选定的第三方网站,因此格式相同,然而,我们无法控制实际内容,如果你的目的地是那里,你能至少发布你收到邮件的格式以及你想从中得到什么吗?通过这种方式,我们可以帮助您构造正则表达式,甚至可以提出更好的解决方案……不幸的是,我不能,它破坏了NDA,但更重要的是,我不是在寻找一个特定的解决方案,而是一种技术/方向,因为我们需要在上面引用其中的一些time@duellsy嗯,在这种情况下很难帮助你。大多数案件肯定可以用法律解决。它们通常是进行这种解析的方法。一旦你开始有嵌套的结构,它们就会崩溃,但听起来你只是想要一些(扁平层次结构)信息在电子邮件的不同位置结束。你能不能至少举一个例子,不透露你的具体格式或数据,但仍然捕获它的整体结构?它肯定不是关键的价值,因为我们希望它是整洁的,不幸的是,我不能显示一个例子电子邮件内容,因为我们在保密协议,我在这个阶段只是真正的技术/方向(与给定格式的特定解决方案相反,因为我们有很多东西要写),我将把你的建议作为常规表达。是的。如果没有regexp,现在还不清楚怎么做,那么它们可能是最简单的方法。有了它们,从消息中获取任何你想要的数据应该很容易。你为什么不至少让我们看一下格式的样子呢?你可以更改名称并替换实际数据垃圾价值真是太好了,谢谢。这正是我想要的。伪代码和通用流。冠军。我奖励你,赏金