Регулярное выражение для нарезки строки с перехлестом

A
На сайте с 09.08.2004
Offline
82
659

Уважаемые форумчане, требуется составить регулярное выражение PCRE для нарезки строки по пробелам словосочетаниями по два слова, но при этом они должны пересекаться.

Например:

"За окном шел снег и рота красноармейцев"

должно превратиться в массив:

$result[0]="За окном";
$result[1]="окном шел";
$result[2]="шел снег";
$result[3]="снег и";
$result[4]="и рота";
$result[5]="рота красноармейцев";

или если рассматривать php-код:

$pattern=???

$string="За окном шел снег и рота красноармейцев";
preg_match_all($pattern,$string,$result);
print_r($result);

ЗЫ. Просьба не предлагать скрипт на php, разделяющий строку на слова по пробелам и потом собирающий их по два слова.

Shtogrin
На сайте с 02.11.2006
Offline
95
#1
Просьба не предлагать скрипт на php, разделяющий строку на слова по пробелам и потом собирающий их по два слова.

Из-за чего такие требования? Так как раз проще решить эту задачу.

www.shtogrin.com (http://www.shtogrin.com/). Канцтовары (http://www.invit.com.ua/). 1С Бухгалтерия (http://account.kiev.ua/).
A
На сайте с 09.08.2004
Offline
82
#2
Shtogrin:
Из-за чего такие требования? Так как раз проще решить эту задачу.

Потому что так задача уже решена и требуется portable-регулярка.

ЗЫ. Просьба не предлагать скрипт на php, разделяющий строку на слова по пробелам и потом собирающий их по два слова.

DyaDya
На сайте с 11.04.2007
Offline
147
#3

Это нужно сделать одним регулярным выражением?

Если честно, думаю... Но пока не могу додуматься как так выкрутиться...

Будет решение, поделитесь... интересно увидеть.

Выбирайте качественный хостинг (http://vashmaster.ru/informaciya/o_poleznyh_programmah/news83.php) и продвигайте сайты в СЕОПУЛЬТ (http://seopult.ru/ref.php?ref=72b5ed9561fe66a1). А на «SAPE» я в обиде :) Не упрекайте за очепятки, пишу вслепую (http://ergosolo.ru/) и также делаю сайты (http://www.vashmaster.ru/) ;)
dkameleon
На сайте с 09.12.2005
Offline
386
#4

похоже, что задача неразрешима одним регвыражением.

Дизайн интерьера (http://balabukha.com/)
М
На сайте с 08.02.2006
Offline
59
#5

Можно двумя в принципе сделать - первое разбивает по парам с начала строки, второе - со второго слова. Что-то вроде этого.

preg_match_all("#(\w+\W+\w+)#si",$text,$lines);

preg_match_all("#(?!^\w+)\W+(\w+\W+\w+)#si",$text,$lines2);

print_r($lines[1]);
print_r($lines2[1]);
Dweep
На сайте с 11.12.2006
Offline
207
#6
Магнат:
Можно двумя в принципе сделать - первое разбивает по парам с начала строки, второе - со второго слова. Что-то вроде этого.

preg_match_all("#(\w+\W+\w+)#si",$text,$lines);

preg_match_all("#(?!^\w+)\W+(\w+\W+\w+)#si",$text,$lines2);

print_r($lines[1]);
print_r($lines2[1]);

Похоже что задача поставленая в условии решена, но чувствую ТС усложнит условие 😂

A
На сайте с 09.08.2004
Offline
82
#7

В общем код Магната работает, но это не совсем то, что нужно.

А никто не пробовал при составлении регулярок использовать рекурсивные шаблоны типа (?R)?

На php.net приведен не очень показательный пример, может кто подскажет другой образец?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий