Я ищу способ извлечь X количество слов по обе стороны от данного слова в поиске.
Например, если пользователь вводит «заключенного» в качестве поискового слова, а запрос MySQL находит сообщение, содержащее «заключенного» в содержании сообщения, я хотел бы вернуть не все содержимое сообщения, а всего лишь x число слова по обе стороны от него, чтобы дать пользователю суть сообщения, а затем они могут решить, хотят ли они продолжить публикацию и прочитать ее полностью.
Я использую PHP.
Благодаря!
Возможно, вы не сможете полностью решить эту проблему с помощью регулярного выражения. Слишком много возможностей других персонажей между словами …
Но вы можете попробовать это регулярное выражение:
((?:\S+\s*){0,5}\S*inmate\S*(?:\s*\S+){0,5})
См. Здесь: rubular
Вы также можете исключить определенные символы, поскольку они не считаются словами. Прямо сейчас регулярное выражение подсчитывает любую последовательность непространственных символов, которые окружены пробелами как словом.
Чтобы соответствовать только реальным словам:
((?:\w+\s*){0,5}<search word>(?:\s*\w+){0,5})
Но здесь любой символ без слова (, "и т. Д.) Тормозит совпадение.
Так что вы можете продолжать …
((?:[\w"',.-]+\s*){0,5}["',.-]?<search word>["',.-]?(?:\s*[\w"',.-]+){0,5})
Это также соответствует 5 словам с одним из «», «вокруг» поискового запроса.
Чтобы использовать его в php:
$sourcestring="For example, if a user enters \"inmate\" as a search word and the MySQL"; preg_match_all('/(?:\S+\s*){0,5}\S*inmate\S*(?:\s*\S+){0,5}/s',$sourcestring,$matches); echo $matches[0][0]; // you might have more matches, they will be in $matches[0][x]
Я бы использовал это регулярное выражение для php, которое также учитывает символы UTF8
'~(?:[\p{L}\p{N}\']+[^\p{L}\p{N}\']+){0,5}<search word>(?:[^\p{L}\p{N}\']+[\p{L}\p{N}\']+){0,5}~u'
В этом случае «~» является разделителем, а модификатор «u» в конце идентифицирует регулярное выражение UTF8.
см. документацию об идентификаторах Unicode Regex: