#php #regex
Вопрос:
Я хочу отобразить результаты поискового запроса на веб-сайте с заголовком и кратким описанием. Краткое описание должно быть небольшой частью страницы, на которой содержится запрос поиска. Что я хочу сделать, так это: 1 удалите теги на странице 2 найдите первую позицию seachterm 3 из этой позиции, возвращаясь назад, найдите начало (если оно есть) этого предложения. 4 Начните с найденной позиции на шаге 3 и отобразите оттуда 200 символов ie
Мне нужна помощь с шагом 3. Я думаю, что мне нужно регулярное выражение, которое находит первую заглавную или точку…
Ответ №1:
Даже это в конечном счете потерпит неудачу. Учитывая предложение «Мы ходили в офис доктора Смита», если ваш поисковый запрос «офис», практически любой критерий, который вы используете, даст вам «офис Смита» в качестве вашего предложения.
Комментарии:
1. Я опубликовал небольшое изменение в стратегии… вы видите в этом какую-нибудь ошибку?
Ответ №2:
Я бы сделал это так: я бы проанализировал страницу…
- Пропустите все, что начинается с ‘
- Когда вы столкнетесь с «.» или [A-Z], начните помещать его в буфер, пока не найдете другое «.»
- Если буферизованная строка содержит ключевое слово для поиска, это ваша строка! Ещё. начните буферизацию с».», с которым вы столкнулись, и повторите.
ПРАВКА: Как отметил Джеймс Карран, в некоторых случаях эта стратегия потерпит неудачу… Итак, вот решение:
Что вы можете сделать, так это начать с X количества символов от начала страницы (после тегов).
а затем выполните поиск по вашему ключевому слову, буферизовав 2 предыдущих слова. Когда вы его найдете, сделайте что-нибудь вроде этого: {X} … {предыдущее-2} {следующее-2}
Пример: У этой планеты есть — или, скорее, была — проблема, которая заключалась в следующем: большинство людей, живущих на ней, были несчастны в течение большей части времени. Для решения этой проблемы было предложено множество решений, но большинство из них были в основном связаны с движением маленьких зеленых листков бумаги, что было странно, потому что в целом недовольными были не маленькие зеленые листки бумаги.
Ключевое слово для поиска: «предложено»
Результат: У этой планеты есть — или, скорее, была — проблема … Для этой проблемы было предложено множество решений …
Ответ №3:
Для шага 3: Если вы перевернете подстроку, которая заканчивается там, где вы хотите выполнить поиск в обратном направлении, получите позицию первого». » и вычитайте это значение из позиции строки поиска.
$offset = stripos( strrev(substr($string, $searchlocation)), '.');
$startloc = $searchlocation - $offset;
$finalstring = substr($string, $startloc, 200);
Это может быть меньше на 1, но я думаю, что это сделает свою работу. Похоже, должен быть более короткий способ сделать это.
Комментарии:
1. Ответ Джеймса Каррана также применим здесь, это все равно не сработает для офиса доктора Смита.
Ответ №4:
Я думаю, что вместо того, чтобы пытаться найти предложения, я бы подумал о количестве контекста вокруг поискового запроса, который мне понадобится в словах. Затем вернитесь назад на некоторую часть этого количества слов (или к началу) и перешлите оставшееся количество слов, чтобы выбрать остальную часть контекста. Таким образом, вы просто разделяете весь корпус на пробелы, находите первое появление термина (возможно, используя нечеткое совпадение для поиска подтем и учета пунктуации) и применяете описанный выше алгоритм. Вы можете даже проявить творческий подход к введению многоточий, если первый не выбранный термин не заканчивается пунктуацией и т. Д.