preg_match, а ключевое слово привязано к чему-то другому - PullRequest
0 голосов
/ 31 октября 2019

Предположим, что у меня есть длинная строка, и я хочу сократить ее таким образом, чтобы она содержала ключевое слово (ключевое слово основано на шаблоне, например {query: ABCD: 1234}), за 5 слов до ключевого слова и 5 словпосле этого. Если ключевое слово появляется само по себе, я могу найти его с помощью этого регулярного выражения:

preg_match("/(([^ ]+ ){5})$keyword (([^ ]+ ){5})/", $text, $matches);

Но если ключевое слово прикреплено к некоторым другим символам (например, запятая или точка), приведенное выше регулярное выражение не может его найти. Если я изменю регулярное выражение на это:

preg_match("/(([^ ]+ ){5})$keyword(([^ ]+ ){5})/", $text, $matches);

Он находит ключевое слово, прикрепленное к запятой, но не одно.

Как я могу охватить оба случая, одно ключевое слово и с вложением,с регулярным выражением?

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Вы можете использовать

preg_match("/((?:\w+\W+){5})" . preg_quote($keyword, "/") . "((?:\W+\w+){5})/", $text, $matches);

Теперь шаблон будет соответствовать:

  • ((?:\w+\W+){5}) - Группа 1: пять вхождений любых символов 1+ слов с последующим 1+ несимволы-слова
  • preg_quote($keyword, "/") - текст $keyword со всеми специальными символами и экранированным разделителем регулярных выражений
  • ((?:\W+\w+){5}) - Группа 2: пять вхождений любых символов, не состоящих из 1+ словсопровождаемый 1+ словом chars
0 голосов
/ 31 октября 2019

Благодаря Wiktor Stribiżew это регулярное выражение исправит это:

"/((?:\w+\W+){5})" . preg_quote($keyword, "/") . "((?:\W+\w+){5})/"
...