Помогите с регуляркой плиз.

akxxiv

Новичок
Помогите с регуляркой плиз.

PHP:
$str = "\row \ltrrow} Здесь может быть куча разных символов...
\row \rows} Здесь может быть куча разных символов...
\row \rows} Здесь может быть куча разных символов...
[#row(lines)#] 
\row \rows} Здесь может быть куча разных символов...
\row \rows} Здесь может быть куча разных символов...
\row \rows} Здесь может быть куча разных символов..."
Мне нужно выбрать из всего этого дела

\row \rows} Здесь может быть куча разных символов...
[#row(lines)#]
\row

Делаю нечто подобное:
PHP:
preg_match_all("~\\\\row[^}]+\}.+(\[#row\(([a-zA-Z0-9_]+)\)#\]).+\\\\row[^}]+\}~Us", $str, $matches, PREG_SET_ORDER);
Получаю:

\row \ltrrow} Здесь может быть куча разных символов...
\row \rows} Здесь может быть куча разных символов...
\row \rows} Здесь может быть куча разных символов...
[#row(lines)#]
\row

Т.е. захыватывает от первого \row до первого после [#row(lines)#] , а хотелось бы чтобы хватало только граничащие с [#row(lines)#] .

Не могу сообразить как сделать. Подскажите плиз.
 

DiMA

php.spb.ru
Команда форума
нихера не понятно написано

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

akxxiv

Новичок
Чего тут не понятного. Есть кусок текста в RTF формате. В этом куске текста есть метка следующего вида:

[#row(mark_name)#]

где mark_name - это название метки на латинице без пробелов.

эта метка с двух сторон на неопределенном расстоянии окаймлена двумя тэгами \row }. между \row и } могут так же быть символы или пробелы, а может и не быть.

В тексте до метки может быть несколько тэгов \row

К сожаления приведенная мной регулярка хавает от первого тега \row в документе до первого тега \row после метки. А мне хотелось бы чтобы она (регулярка) захватывала только 2 тега: 1 до метки и 1 после, ну и весь текст между ними.

Вопрос как исправить мою регулярку чтобы она вела себя соответствующим образом.

Надеюсь теперь я более ясно изложил суть проблемы?
 

dimagolov

Новичок
В этом куске текста есть метка следующего вида:

[#row(mark_name)#]
мне жаль тебя разочаровывать, но метка в RTF (если он сгенерирован текстовым редактором) с большой долей вероятности может быть разорвана между разными блоками. как-то предовратить эту ситуацию не представляется возможным, надо ее коррестно обрабатывать, то есть вырезать блоки с форматированием. кроме тех блоков, которые содержат разрывы строк.

-~{}~ 26.08.09 09:42:

"то есть вырезать блоки с форматированием" - вернее вырезать закрывающую скобку блока после начала метки (вернее первого ее символа) и до начала текстовки в сдедующем блоке, разбирать полученную строку отвечает она шаблону метки или нет и т.д. посимвольно в общем случае.

п.с. таким образом мы будем игнорировать форматирование частей метки. НО надо не игнорировать разрывы строки (то есть если метка некорректная и обрывается)
 

akxxiv

Новичок
Автор оригинала: DiMA
читай о (?= .... )
Вообще не понимаю как это работает. :mad:
Как не включать в выборку все что перед последним \row который находится до метки.

:confused:
 

freeek

Новичок
и все таки
как это вопрос решить

+ за DiMA и его (?= .... ), хотя я подумал о (?!....)
 

akxxiv

Новичок
Я так и не допер, как его решить одной регуляркой. Сделал двумя. 1-я та что приводил выше, выбирает от первого совпадения до первого после метки. А вторая обрезает от конца до первого перед меткой. Пока так. Решение данной проблемы отложил до лучших времен...
 

freeek

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

akxxiv

Новичок
Походу этот вопрос надо переносить в теорию программирования ))
 

dimagolov

Новичок
какая нафиг теория? регулярки в общем не пригодны для синтаксического анализа, а rtf надо разбирать с учетом его синтаксиса. даже для простого поиска и замены.
 

akxxiv

Новичок
Если правильно подготовить шаблон, хотя бы в том же MS Word, как я собственнои и делаю, то замена происходит простым str_replace. А регулярка нужна, чтобы делать многострочные таблицы. Например в шаблоне делаешь таблицу в 1 строчку, вставляешь вначало ее метку, что это ряд таблицы и имя этого ряда, а класс с помощью регулярки делает сколь угодно много строк. Короче все работает, но с первой регуляркой было условие, что вставляемый ряд находится в первой строчке после шапки, иначе класс задваивал ряды, это было связано с захватом лишнего. Для этого и понадобилось исправить регулярку. Но т.к. это сделать не удалось - поставил пока вторую регулярку.

Правда появилась одна непонятная для меня проблемка. Если в RTF-ину вставить картинку, например логотип. То файл значительно возрастал в размерах - это понятно, но при оттдаче данного файла, он приходил битый. Решения данной проблемы было два, причем в чем их связь мне не ясно:

1. Убрал вторую регулярку, файл открывается нормально, но с задвоиными с строками.
2. Просто перед отдачей файла (в браузер) поставил ob_start("ob_gzhandler", 9); И он опять же замечательно приходит, даже если не убирать вторую регулярку.
 

Smelo

Новичок
нифига не понял
мб

preg_match_all("~(\\\\row[^}]+\}.+(\[#row\(([a-zA-Z0-9_]+)\)#\]).+)\\\\row[^}]+\}~Us", $str, $matches);

print_r($matches[1]);
 

akxxiv

Новичок
Автор оригинала: Smelo
нифига не понял
мб

preg_match_all("~(\\\\row[^}]+\}.+(\[#row\(([a-zA-Z0-9_]+)\)#\]).+)\\\\row[^}]+\}~Us", $str, $matches);

print_r($matches[1]);
Получится

PHP:
Array
        (
            [0] => \row \ltrrow}\pard 111111111111111 
\row \rows} \lrowa 2222222222222222 
\row \rows} \lrowa 3333333333333333 
[#row(lines)#] 
 
        )
а должно быть:

PHP:
Array
        (
            [0] =>  \lrowa 3333333333333333 
[#row(lines)#] 
\row \rows}
 
        )
 

dimagolov

Новичок
Автор оригинала: akxxiv
Правда появилась одна непонятная для меня проблемка. Если в RTF-ину вставить картинку, например логотип. То файл значительно возрастал в размерах - это понятно, но при оттдаче данного файла, он приходил битый. Решения данной проблемы было два, причем в чем их связь мне не ясно:

1. Убрал вторую регулярку, файл открывается нормально, но с задвоиными с строками.
2. Просто перед отдачей файла (в браузер) поставил ob_start("ob_gzhandler", 9); И он опять же замечательно приходит, даже если не убирать вторую регулярку.
пошел махровый шаманизм :D
 
Сверху