Найдите начало предложения в строке

#php #regex

Вопрос:

Я хочу отобразить результаты поискового запроса на веб-сайте с заголовком и кратким описанием. Краткое описание должно быть небольшой частью страницы, на которой содержится запрос поиска. Что я хочу сделать, так это: 1 удалите теги на странице 2 найдите первую позицию seachterm 3 из этой позиции, возвращаясь назад, найдите начало (если оно есть) этого предложения. 4 Начните с найденной позиции на шаге 3 и отобразите оттуда 200 символов ie

Мне нужна помощь с шагом 3. Я думаю, что мне нужно регулярное выражение, которое находит первую заглавную или точку…

Ответ №1:

Даже это в конечном счете потерпит неудачу. Учитывая предложение «Мы ходили в офис доктора Смита», если ваш поисковый запрос «офис», практически любой критерий, который вы используете, даст вам «офис Смита» в качестве вашего предложения.

Комментарии:

1. Я опубликовал небольшое изменение в стратегии… вы видите в этом какую-нибудь ошибку?

Ответ №2:

Я бы сделал это так: я бы проанализировал страницу…

  1. Пропустите все, что начинается с ‘
  2. Когда вы столкнетесь с «.» или [A-Z], начните помещать его в буфер, пока не найдете другое «.»
  3. Если буферизованная строка содержит ключевое слово для поиска, это ваша строка! Ещё. начните буферизацию с».», с которым вы столкнулись, и повторите.

ПРАВКА: Как отметил Джеймс Карран, в некоторых случаях эта стратегия потерпит неудачу… Итак, вот решение:

Что вы можете сделать, так это начать с X количества символов от начала страницы (после тегов).

а затем выполните поиск по вашему ключевому слову, буферизовав 2 предыдущих слова. Когда вы его найдете, сделайте что-нибудь вроде этого: {X} … {предыдущее-2} {следующее-2}

Пример: У этой планеты есть — или, скорее, была — проблема, которая заключалась в следующем: большинство людей, живущих на ней, были несчастны в течение большей части времени. Для решения этой проблемы было предложено множество решений, но большинство из них были в основном связаны с движением маленьких зеленых листков бумаги, что было странно, потому что в целом недовольными были не маленькие зеленые листки бумаги.

Ключевое слово для поиска: «предложено»

Результат: У этой планеты есть — или, скорее, была — проблема … Для этой проблемы было предложено множество решений

Ответ №3:

Для шага 3: Если вы перевернете подстроку, которая заканчивается там, где вы хотите выполнить поиск в обратном направлении, получите позицию первого». » и вычитайте это значение из позиции строки поиска.

 $offset = stripos( strrev(substr($string, $searchlocation)), '.');
$startloc = $searchlocation - $offset;
$finalstring = substr($string, $startloc, 200);
 

Это может быть меньше на 1, но я думаю, что это сделает свою работу. Похоже, должен быть более короткий способ сделать это.

Комментарии:

1. Ответ Джеймса Каррана также применим здесь, это все равно не сработает для офиса доктора Смита.

Ответ №4:

Я думаю, что вместо того, чтобы пытаться найти предложения, я бы подумал о количестве контекста вокруг поискового запроса, который мне понадобится в словах. Затем вернитесь назад на некоторую часть этого количества слов (или к началу) и перешлите оставшееся количество слов, чтобы выбрать остальную часть контекста. Таким образом, вы просто разделяете весь корпус на пробелы, находите первое появление термина (возможно, используя нечеткое совпадение для поиска подтем и учета пунктуации) и применяете описанный выше алгоритм. Вы можете даже проявить творческий подход к введению многоточий, если первый не выбранный термин не заканчивается пунктуацией и т. Д.