2010-03-23 1 views
3

Мне нужно регулярное выражение, которое будет извлекать предложения из текста, содержащего год в них.PHP регулярное выражение для соответствия предложениям, которые содержат год

Пример текста:

Далее, в 1988 году Bradys вернулись снова на праздник торжества, "A Очень Brady Рождество". Сюзан Олсен (Синди) будет отсутствовать в этом воссоединении, Дженнифер Рунион взяла ее место. Это был двухчасовой фильм в , который Bradys собрал вместе с празднуют Рождество, представляя мирусупругам и детям Brady kids. Этот фильм был Наивысший рейтинг TV-фильм 1988

Если текст примера был переменной $ строка, мне нужно, чтобы вернуться:

  • $ sentenceWithYear [0] = Далее, в 1988 Bradys снова вернулись на праздник , «Очень Брэди Рождество».
  • $ sentenceWithYear [1] = Этот фильм был самым высоким рейтингом ТВ-фильм 1988.

Если это возможно, чтобы сохранить год через регулярное выражение, я использовал бы год в предложении и в конце концов вставить предложения в базу данных, как:

INSERT INTO table_name (год, предложение) VALUES ('$ год', '$ sentenceWithYear [х])

+0

+1 для очень интересного и продуманного вопроса –

ответ

3

Попробуйте это:

$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.') 

Обязательно, чтобы избежать ваших запросов, хотя.

5

(Это не ответ, но предложение)

Я думаю, что вы пытаетесь сделать это слишком сложно.Вы действительно есть две проблемы:

  1. Перерыв абзаца на предложения
  2. определить, какие предложения содержат 4-значное число, вероятно, в диапазоне 1900-2100 или около того.

Пункт №1 довольно сложный, из-за двусмысленного использования. персонаж. Например, как бы вы обрабатываете предложения:

Я родился в 1986 году г-н Смит родился в 1976 году

Вы должны быть в состоянии признать, что период после «Mr» не является завершающим приговор символом и что на самом деле есть два предложения. Большинство ответов, которые вы получаете (в том числе @ Tatu), сделают наивный раскол, основанный на периоде.

редактировать другой случай использования: деньги

Я заработал $ 42,00 вчера, что я не должен сообщать о моей налоговой декларации 2010 года.

Как только вы сможете адекватно идентифицировать предложения, точка № 2 довольно тривиальна.

Смежные вопросы