Извлечь X количество слов, окружающих заданную строку поиска в строке - PullRequest
7 голосов
/ 24 ноября 2011

Я ищу способ извлечь X количество слов по обе стороны от заданного слова в поиске.

Например, если пользователь вводит слово «заключенный» в качестве поискового слова, а запрос MySQL находит сообщение, содержащее слово «заключенный» в содержании сообщения, я хотел бы вернуть не все содержимое сообщения, а просто x количество слов по обе стороны от него, чтобы дать пользователю смысл сообщения, а затем они могут решить, хотят ли они перейти к сообщению и прочитать его полностью.

Я использую PHP.

Спасибо!

Ответы [ 2 ]

9 голосов
/ 24 ноября 2011

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

Но вы можете попробовать это регулярное выражение:

((?:\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]
2 голосов
/ 21 февраля 2012

Я бы использовал это регулярное выражение для 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 здесь:

http://www.regular -expressions.info / refunicode.html

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