1

从事需要解析传入电子邮件,提取某些信息并将其存储在数据库中的项目。我们正在使用 postmarkapp 来提取电子邮件的正文内容,因此我们只有文本的内容,但我目前对如何以最有效的方式解析电子邮件有点困惑。

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

我在想我们将有一个接口来处理常见任务,并且每种支持的格式都将实现它,但是如何获取这些信息是我被卡住的地方。

对不同方法/技术的任何想法和想法持开放态度,最好是 PHP,但如果我们需要使用其他东西,那很好。

4

2 回答 2

2

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

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

每种格式都有一个 Parser 实现类。每个类中的parseText()方法负责从文本中获取数据。我们寻找使这些优雅和通用的方法,但根本没有找到一个真正好的方法来做到这一点。我们使用正则表达式的组合,将字符串分成更小的部分,然后遍历字符串。

伪代码:

$text = $_POST['emailBody'];
$parser = getParserForText($text);
$result = $parser->parseText($text);
if(count($result["errors"]) > 0)
{
    // handle errors
}
else
{
    saveToDatabase($result["prices"]);
}

我们无法控制供应商使用的格式,因此我们不得不求助于:

  1. 将文本拆分为带有日期的每一行周围的字符串数组 (prey_split())

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

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

  4. 对于每一行,使用正则表达式查找价格 ($000.0000) 并将其拉出

  5. 修剪该行的其余部分以用作产品名称

我们使用了很多prey_split(),preg_match_all()explode()。虽然在我看来它不是特别优雅或通用,但该系统非常强大。通过在正则表达式中留出一点回旋余地,我们已经完成了一些小的格式更改,而无需更改代码。“摆动空间”我的意思是:不要搜索空格,搜索任何空白。不要搜索一个美元符号和两个数字,而是搜索一个美元符号和任意数量的数字。诸如此类的小事。

编辑:

这是我几年前问过的一个问题: 阅读文本的算法或模式

于 2012-12-05T16:01:23.113 回答
0

由于它是生成的电子邮件,它很可能采用易于解析的格式,例如每条指令一行;key=value. 然后,您可以拆分第一个 - 符号上的行=并使用它为您提供的键值对。

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

如果格式对于这种简单的解析来说太复杂了,请举一个使用该格式的文件的示例,以便我可以使答案更具体。如果这不是您要问的答案,同样的事情:请举例说明您想要的答案。

于 2012-12-01T13:12:56.610 回答