【问题标题】:How would you parse this ingredient line?你将如何解析这个成分线?
【发布时间】:2011-04-23 02:28:32
【问题描述】:

我有一个充满成分行的文本区域;通常采用 [数量] [测量] [成分] [附加] 格式。例如,一些成分行可能是:

1汤匙大蒜,切碎
1杯甜椒,切碎

我希望能够识别每个测量值和成分——您将如何处理它?我的思路是……

// loop thru line by line of textarea

// explode each line by the space thus line[0] would be 1, line[1] tablespoon, line[2] garlic... etc

现在这是我的问题,我不确定什么是有效的。我是否通过数据库搜索运行每一行 [X] 来搜索该测量值、成分等?但是由于“甜椒”是用空格隔开的,所以我不会得到匹配。

// does line[1] appear in the measurements table?
// does line[2] appear in the ingredients table?

还有其他人有什么创造性的解决方案吗?

【问题讨论】:

  • 这很棘手。例如,他们可能会放“1 汤匙”,甚至“1 汤匙”或“1 汤匙”,而不是“1 汤匙”。或“1 汤匙”。或“cup of X”而不是“1 cup X”。除非您的用户非常听从您的输入标准(哈!),否则这将很难可靠地解析。您可能需要考虑使用 AI。特别是自然语言处理。或者只是有一群版主。 :)
  • 哈哈,好东西。我希望结合使用一些解析和版主团队。如果代码可以减少版主解析成分列表所需的时间,我会很高兴。

标签: parsing theory


【解决方案1】:

不是用空格而是另一个分隔符来分隔您的数据。例如你可以这样做:

$strRecipe = "1 | tablespoon | bell pepper |  minced";

然后你可以使用:

$recipe = explode("|",$strRecipe);

现在您可以通过以下方式访问每个字段:$recipe[0]、$recipe[1] ETC ETC

【讨论】:

  • 很好的建议!我想知道用户是否会效仿。我假设用户可能只是在复制他们在电子邮件、Facebook 等中的食谱。不过,我想我可以有一个版主团队来帮助重新解析数据。
  • 您可以让用户在单独的文本框中输入每个组件或预先填充选择框。这样,您将始终知道输入可能是什么。让用户在一个框中输入所有食谱会很棘手,因为他们会输入废话。
【解决方案2】:

尝试使用stripos() 来定位子字符串,而不是explode()

$mytext = "1 tablespoon garlic, minced 1 cup bell pepper, chopped"; # or any text
$keyword = "bell pepper"; # or any search term

if (stripos($mytext, $keyword) === false) {
  # not found
  ...
  }
else {
  # found
  ...
  }

参考文献

您可以使用explode()(不推荐),但您也应该在搜索词中分隔单词并查找数组中第一个关键字的出现,其中下一个关键字出现在数组的下一个元素中,等等。这是不必要的复杂化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2016-12-07
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多