处理需要解析传入电子邮件的项目,并提取某些信息并将其存储在数据库中。我们正在使用postmarkapp来提取电子邮件的正文内容,所以我们只有文本的内容,但我现在有点坚持如何以最有效的方式解析电子邮件。
随着时间的推移,我们将添加更多“接受”的传入邮件格式,但首先我们可能会收到4封常见的电子邮件,也就是说,它们会遵循相同的格式和信息。想要提取(联系方式,id,链接,生物)将在同一个地方,(每种支持的格式)。
我认为我们将拥有一个可以处理常见任务的界面,每个支持的格式都会实现这一点,但是如何获取这些信息就是我被困住的地方。
开放任何有关不同方法/技术的想法和想法,最好是PHP,但如果我们需要使用其他东西,那很好。
答案 0 :(得分:2)
我开发的网站上有类似的功能。我们的用户通过定价从供应商处收到电子邮件。他们将电子邮件的正文复制并粘贴到我们网站上的textarea中,然后单击按钮。然后我们解析文本以查找产品和价格,并将信息粘贴到数据库中。
要进行解析,我们首先必须确定供应商,就像您需要确定使用哪个模板一样。我们会在文本中查找某些字符串 - 通常是供应商的名称,或者是电子邮件中唯一的一行。我们在一个名为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"]);
}
我们无法控制供应商使用的格式,因此我们不得不求助于:
将文本拆分为每行左右的字符串数组,并带有日期(prey_split())
对于该数组中的每个元素,第一行包含日期,接下来的三到六行包含产品和价格
将日期拉出,然后将字符串拆分为新行
,使用正则表达式查找价格($ 000.0000)并将其拉出来
修剪该行的其余部分以用作产品名称
我们使用了大量prey_split()
,preg_match_all()
和explode()
。虽然在我看来并不特别优雅或通用,但该系统非常强大。通过在正则表达式中留下一点摆动空间,我们通过一些小格式更改使其无需更改代码。通过“摆动空间”我的意思是:不要搜索空格,搜索任何空格。不要搜索美元符号和两个数字,搜索美元符号和任意数量的数字。像这样的小事。
编辑:
这是几年前我问过的一个问题: Algorithms or Patterns for reading text
答案 1 :(得分:0)
由于它是生成的电子邮件,它很可能是一种易于解析的格式,例如每条指令一行; key=value
。然后,您可以在第一个=
- 符号上拆分行,并使用它为您提供的键值对。
当您无法控制传入的数据格式时,正则表达式很有用,但是当您这样做时,更容易确保它在没有正则表达式的情况下可以解析。
如果格式对于这种简单的解析而言过于复杂,请使用该格式给出一个文件示例,这样我就可以使答案更具体。同样的事情,如果这不是你要问的问题的答案:请举例说明你想要的那种答案。