Извлечь часть строки до и после слова, используя preg_replace - PullRequest
0 голосов
/ 30 октября 2019

У меня длинный текст, и я хочу сократить его таким образом, чтобы было определенное ключевое слово, 5 слов до и 5 слов после этого ключевого слова. Ключевое слово содержит некоторые специальные символы, как я могу сделать это с помощью preg_match в PHP?

Я хочу найти шаблон {query: some_text_goes_here: some_number_goes_here}. Примером будет:

{query:this is a test:123456}

Таким образом, учитывая следующее, текст:

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc aliquam posuere efficitur. Maecenas interdum sem massa, eu tincidunt dolor lacinia quis. Fusce faucibus odio urna, eu consectetur enim congue in. Cras id neque nec urna pellentesque {query:this is a test:123456} feugiat. Etiam ut elit sed lectus tempor fringilla. Nullam metus lectus, ullamcorper eget interdum eu, volutpat convallis augue. Ut pretium accumsan felis a placerat. Aenean aliquam orci quis elementum tincidunt  

Мой желаемый результат:

id neque nec urna pellentesque {query:this is a test:123456} feugiat. Etiam ut elit sed

Ответы [ 2 ]

1 голос
/ 30 октября 2019

DEMO обоих.

Здесь preg_replace заменяет все группы захвата 1 и 3:

$keyword = preg_quote('{query:this is a test:123456}');
$text = preg_replace("/.*?(([^ ]+ ){5})$keyword (([^ ]+ ){5}).*/", '$1$3', $text);

Объяснение и графика:

Regular expression visualization

Демонстрация Debuggex

Вот preg_match с использованием групп захвата 1 и 3из матча:

$keyword = preg_quote('{query:this is a test:123456}');
preg_match("/(([^ ]+ ){5})$keyword (([^ ]+ ){5})/", $text, $matches);
echo $matches[1].$matches[3];

Объяснение и графика:

Regular expression visualization

Демонстрация Debuggex

1 голос
/ 30 октября 2019

вы можете использовать preg_match вот так в php

(?:\w+\W+(?:\w+\W+){0,4})?({query:this is a test:123456})(?:\W+\w+(?:\W+\w+){0,4})

, так что вы можете объединиться во что-то вроде этого

preg_match('/(?:\w+\W+(?:\w+\W+){0,4})?({query:this is a test:123456})(?:\W+\w+(?:\W+\w+){0,4})/', $input_line, $output_array);
...