PHP正则表达式匹配包含一年的句子

PHP正则表达式匹配包含一年的句子,php,regex,Php,Regex,我需要一个正则表达式,可以从包含一年的文本中提取句子 示例文本: 接着,1988年布雷迪一家又回来了 又一次是为了庆祝节日 非常愉快的圣诞节”。苏珊·奥尔森 (辛迪)会从中消失 重逢,珍妮弗·鲁尼恩带走了她 地点。这是一部两小时的电影 布雷迪一家聚在一起 庆祝圣诞节,介绍 世界之家的配偶和子女 布雷迪的孩子们。这部电影是第一部 1988年收视率最高的电视电影 如果示例文本是变量$string,我需要它返回: $sentenceWithYear[0]=下一个,1988年 布雷迪一家又回来了 “节

我需要一个正则表达式,可以从包含一年的文本中提取句子

示例文本:

接着,1988年布雷迪一家又回来了 又一次是为了庆祝节日 非常愉快的圣诞节”。苏珊·奥尔森 (辛迪)会从中消失 重逢,珍妮弗·鲁尼恩带走了她 地点。这是一部两小时的电影 布雷迪一家聚在一起 庆祝圣诞节,介绍 世界之家的配偶和子女 布雷迪的孩子们。这部电影是第一部 1988年收视率最高的电视电影

如果示例文本是变量$string,我需要它返回:

  • $sentenceWithYear[0]=下一个,1988年 布雷迪一家又回来了 “节日庆典”是一个非常乏味的节日 圣诞节”
  • $sentenceWithYear[1]=这部电影 是世界上收视率最高的电视电影 1988年
如果可以通过正则表达式保留年份,我会在句子中使用年份,并最终将句子插入数据库,如:

在表中插入名称(年份,句子)值(“$year”和“$sentenceWithYear[x]”)

尝试以下操作:

$string = ".".str_replace(".", "..", rtrim($string, '.')).".";
preg_match_all("~\.[^.]*?((19|20)\d{2})[^.]*?\.~", $string, $sentenceWithYear);
注意,您需要添加额外的点作为正则表达式的断点。每个句子前后都必须有自己的点,因此:

'Sentence 1. Sentence 2.'
变成这样:

'.Sentence 1.. Sentence 2.'
该正则表达式将生成如下匹配:

Array (
    0 => Array (
        0 => '.Next, in 1988 the Bradys were back again for a holiday celebration, "A Very Brady Christmas".',
        1 => '. This movie was the highest rated TV-movie of 1988.'
    ),
    1 => Array (
        0 => 1988,
        1 => 1988
    )
)
然后,您可以轻松地遍历结果并将其插入数据库。请注意,这些句子仍然存在前面的点,您需要使用
ltrim
来消除它

foreach($sentenceWithYear[0] as $key => $sentence) {
    $q = "INSERT INTO
              table_name (year, sentence)
          VALUES ('".$sentenceWithYear[1][$key]."', '".ltrim($sentence, ". ")."')";
    mysql_query($q);
}
这将生成如下查询:

INSERT INTO table_name (year, sentence) VALUES ('1988', 'Next, in 1988 the Bradys were back again for a holiday celebration, "A Very Brady Christmas".')
INSERT INTO table_name (year, sentence) VALUES ('1988', 'This movie was the highest rated TV-movie of 1988.')
不过,一定要避开你的疑问。

(这不是答案,而是建议)

我觉得你想把事情弄得太复杂了。你确实有两个问题:

  • 把段落分成句子
  • 确定哪些句子包含4位数字,可能在1900-2100左右
  • 第#1点相当困难,因为使用的是模糊的。性格例如,您将如何处理以下句子:

    我出生于1986年。史密斯先生生于1976年

    您需要能够认识到“Mr”之后的句点不是一个句子结束字符,实际上有两个句子。你得到的大多数答案(包括@Tatu的答案)都会根据时间段进行简单的分割

    编辑另一个用例:money

    我昨天赚了42美元,不用在2010年的纳税申报表上申报


    一旦你能够充分识别句子,第2点就很简单了。

    +1是一个非常有趣和发人深省的问题