我开发的网站上有一个类似的功能。我们的用户从他们的供应商那里收到带有定价的电子邮件。他们将电子邮件正文复制并粘贴到我们网站的文本区域中,然后单击按钮。然后我们解析文本以查找产品和价格并将信息存入数据库。
要进行解析,我们首先必须确定供应商,就像您需要确定使用哪个模板一样。我们在文本中查找某些字符串——通常是供应商的名称,或者是他们的电子邮件特有的一行。我们在一个叫做类似的方法中做到这一点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()
。虽然在我看来它不是特别优雅或通用,但该系统非常强大。通过在正则表达式中留出一点回旋余地,我们已经完成了一些小的格式更改,而无需更改代码。“摆动空间”我的意思是:不要搜索空格,搜索任何空白。不要搜索一个美元符号和两个数字,而是搜索一个美元符号和任意数量的数字。诸如此类的小事。
编辑:
这是我几年前问过的一个问题:
阅读文本的算法或模式