Регулярное выражение PHP для коллекции слов вокруг поисковой фразы

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

возьмите 5 слов перед фразой поиска (или x, если там есть только x слов) и 5 ​​слов после фразы поиска (или x, если там есть только x слов) из блока текста (когда я говорю слова, я имею в виду слова или числа, которые находятся в блоке текста)

например

Добро пожаловать в переполнение стека! Посетите страницу пользователя, чтобы указать свое имя и адрес электронной почты.

если бы вы искали «визит», он бы вернулся: Добро пожаловать в Stack Overflow! Посетите страницу пользователя, чтобы установить

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

Заранее спасибо

на дополнительном примечании может быть лучший способ добраться до моего результата, если вы чувствуете, что есть, пожалуйста, не стесняйтесь бросать его в пул, поскольку я не уверен, что это лучший только первый способ, который я думал, чтобы сделать то, что Мне нужно: D

Related of "Регулярное выражение PHP для коллекции слов вокруг поисковой фразы"

Как насчет этого:

(\S+\s+){0,5}\S*\bvisit\b\S*(\s+\S+){0,5} 

будет соответствовать пяти «словам» (но меньше, если текст короче) до и после вашего поискового слова (в этом случае visit ).

 preg_match_all( '/(\S+\s+){0,5} # Match five (or less) "words" \S* # Match (if present) punctuation before the search term \b # Assert position at the start of a word visit # Match the search term \b # Assert position at the end of a word \S* # Match (if present) punctuation after the search term (\s+\S+){0,5} # Match five (or less) "words" /ix', $subject, $result, PREG_PATTERN_ORDER); $result = $result[0]; 

Я определяю «слово» как последовательность символов без пробелов, разделенных хотя бы одним пробелом.

Слова поиска должны быть действительными словами (начиная и заканчивая буквенно-цифровым символом).

Вы можете сделать следующее (это бит вычислительный тяжелый, поэтому он не будет эффективным для очень длинных строк):

 <?php $phrase = "Welcome to Stack Overflow! Visit your user page to set your name and email."; $keyword = "Visit"; $lcWords = preg_split("/\s/", strtolower($phrase)); $words = preg_split("/\s/", $phrase); $wordCount = 5; $position = array_search(strtolower($keyword), $lcWords); $indexBegin = max(array($position - $wordCount, 0)); $len = min(array(count($words), $position - $indexBegin + $wordCount + 1)); echo join(" ", array_slice($words, $indexBegin, $len)); //prints: Welcome to Stack Overflow! Visit your user page to set 

Пример Codepad