Yau*_*ich 5 php regex algorithm heuristics date
我在启发式解析包含日期但采用相当任意(未知)格式的文本字符串时遇到问题。
function parseDateStr($text) {
$cleanText = filter($text);
# ...
$day = findDay($cleanText);
$month = findMonth($cleanText);
$year = findYear($cleanText);
# .. assert constraints, parse again or fail
return sprintf('%04d-%02d-%02d', $year, $month, $day)
}
Run Code Online (Sandbox Code Playgroud)
输入文本是英文句子加上任意语法符号(如 \W regexp 类的子集)。该算法的任务是仅在过滤掉与日期无关的任何潜在垃圾(嘈杂)词之后才提取日期。允许算法失败并且不返回结果。如果在字符串中只找到两个连接的数字 (MM) 和其他四个数字 (YYYY) 的两个组合 - 假设两个数字对应于日期的月份,并且日期被视为 01(日期的第一天)这个月)。结果以“YYYY-MM-DD”(SQL)格式(日期类型)给出日期。
我的想法是继续使用preg_replace & co设计一系列过滤器。此外,对 $year、$day 的范围使用逻辑约束,对 $month 使用词汇等,但如果可以想到或已经存在类似但更优雅的解决方案或方法,我不会感到惊讶。如果是这样,请让我知道他们。如果可以指出任何批评者或潜在的陷阱,我也将不胜感激。
类似问题的相关资料:
请注意,该问题与更基本的日期解析问题不同,因为:
因为就我而言,我无法指定或确定字符串的格式。另一方面,以下问题讨论了类似的任务:
我不确定最后一个是否重复,我最终不清楚 OP 想要解析什么(尽管checkdate和date_parse似乎部分有用)。但是关于整个“mokey business”的第一个问题也适用于我的案例,并且已通过模糊解析解决,如
dparser.parse("monkey 2010-07-10 love banana",fuzzy=True)
Run Code Online (Sandbox Code Playgroud)
最后,第二个包含很好的抓取正则表达式(几乎“模糊”)。
PS by优雅我知道代码相当紧凑(性能没有明显限制,所以使用“hacky”正则表达式是可以的)。
好吧,date_parse的表现非常好,了解原因很有教育意义。PHP 函数date_parse是ext/date/lib或timelib 的一部分,显然(尽管缺乏适当的文档)它在 C 中的实现(由 Derick Rethans 编写并从 Zend Engine 宏部分调用,并带有声明)使它成为一个聪明的工具:
就我而言,我未能从我的数据集中找到任何未被date_parse解析的输入示例,即:
echo FuzzyDateParser::fromText('banana 1/2/3');
echo FuzzyDateParser::fromText('Joe Soap was born on 12 February 1981'));
echo FuzzyDateParser::fromText('2005 Feb., reprint'));
echo FuzzyDateParser::fromText('!'); # will fail to parse, producing an empty string.
echo FuzzyDateParser::fromText('monkey 2010-07-10 loves bananas and php');
Run Code Online (Sandbox Code Playgroud)
FuzzyDateParser 类的代码可以在这个要点中找到。它可以用作模板来处理错误并实现从date_parse 结果到自己的自定义逻辑的回退(我最终不必为我的案例做)。
| 归档时间: |
|
| 查看次数: |
1953 次 |
| 最近记录: |