PHP регулярное выражение для сопоставления предложений, которые содержат год - PullRequest
3 голосов
/ 24 марта 2010

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

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

Далее, в 1988 году Брэдис вернулся снова на праздник "А Очень брэйди Рождество ". Сьюзен Олсен (Синди) будет отсутствовать в этом воссоединение, Дженнифер Руньон взяла ее место. Это был двухчасовой фильм в к которому собрались Брэдис праздновать Рождество, представляя мир супругам и детям дети Брэди. Этот фильм был Телевизионный фильм 1988 года с самым высоким рейтингом.

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

  • $ фразеWithYear [0] = Далее в 1988 Брэдис вернулся снова на Празднование праздника "Очень Брэди" Рождество ".
  • $ фразеWithYear [1] = Этот фильм был самым рейтинговым телевизионным фильмом 1988.

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

INSERT INTO table_name (год, предложение) VALUES ('$ year', '$ фразеWithYear [x]')

Ответы [ 2 ]

5 голосов
/ 24 марта 2010

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

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

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

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

Я родился в 1986 году. Мистер Смит родился в 1976 году.

Вы должны быть в состоянии распознать, что точка после "Мистера" не является завершающим предложением, и что на самом деле есть два предложения. Большинство ответов, которые вы получите (в том числе @ Tatu's), будут наивно разделены на основе периода.

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

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

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

3 голосов
/ 24 марта 2010

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

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

Обязательно избегайте ваших запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...