Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Разбить текст на блоки
 
 автор: Evgen   (08.02.2012 в 19:56)   письмо автору
 
 

Что-то не могу найти правильный вариант, подскажите плз!

Есть текст, состоящий из блоков текста (только из блоков, вне блоков текст отсутствует), которые начинаются с определенных маркеров.

Например так:
Маркеры - А,В,С
Тексты, следующие за этими маркерами, соответственно: text_a, text_b, text_c.

Длина блоков может быть различной. Маркеры окончания блоков отстутствуют (точнее так - начало следующего блока и есть конец предыдущего). Последовательность расположения блоков - произвольная.

Задача: поделить весь текст на блоки для их последующей обработки.

Следущий фрагмент замечательно разделяет текст,

<?
$txt 
"..."// текст из файла

$pattern "A|B|C";

// делим текст на блоки и сохраняем в массив
$array split ($pattern$txt);
?>

но в массиве остается текст, не понятно к какому маркеру принадлежащий:

<?
print_r 
($array);
?>

результат
[0] => text_?
[1] => text_?
[2] => text_?

Как разбить текст, чтобы он содержал в себе и маркер?

  Ответить  
 
 автор: Sfinks   (08.02.2012 в 21:01)   письмо автору
 
   для: Evgen   (08.02.2012 в 19:56)
 

Описание split();
........
Внимание
С версии PHP 5.3.0 эта функция считается УСТАРЕВШЕЙ. Крайне не рекомендуется полагаться на эту возможность.
из мана.

Можно так:
<pre><?php
  $s 
"A text_a B text_b C text_c";
  
preg_match_all("#(?:A|B|C)([^ABC$]*)#",$s,$out);
  
print_r($out);
?></pre>
Array
(
    [0] => Array
        (
            [0] => A text_a 
            [1] => B text_b 
            [2] => C text_c
        )

    [1] => Array
        (
            [0] =>  text_a 
            [1] =>  text_b 
            [2] =>  text_c
        )

)

  Ответить  
 
 автор: Evgen   (09.02.2012 в 13:02)   письмо автору
 
   для: Sfinks   (08.02.2012 в 21:01)
 

Да, это уже почти ОНО. Большое спасибо Sfinks !!!

А "почти" - потому что preg_match_all я пробовал до того как обратиться сюда, но не смог составить правильную регулярку, поэтому результат был не тот, который требуется.
(?:A|B|C)([^ABC$]* - работает отлично, если ABC - одиночные символы A, B, C.
Если они являются словами, то как их сюда правильно вставить - не понимаю...
Т.е. если например
A = alpha,
B = betta,
то выражение
(?:alpha|betta|C)([^alpha betta C$]
естественно работать не будет.
Как правильно заменить символы ABC на соответствующие им слова ?

PS. Перечитывание в пятый раз раздела "Регулярные выражения" в "РНР5 на примерах" пока не привело меня к просветлению =/

  Ответить  
 
 автор: Sfinks   (09.02.2012 в 15:19)   письмо автору
 
   для: Evgen   (09.02.2012 в 13:02)
 

<pre><?php
  $s 
"Dodge text_a Mazda text_b Ford text_c";
  
preg_match_all("#(?:Mazda|Ford|Dodge)(.*?)(?=Mazda|Ford|Dodge|$)#",$s,$out);
  
print_r($out);
?></pre>
как-то так....

  Ответить  
 
 автор: Evgen   (09.02.2012 в 23:23)   письмо автору
 
   для: Sfinks   (09.02.2012 в 15:19)
 

Sfinks, да Вы просто монстр в RegExp =)
Огромное человеческое спасибо!

Хотя и пришлось покопаться немного в статьях по регуляркам, чтоб найти "позитивный просмотр вперед" и расшифровать вот это "?:", но главное - удалось получить требуемый результат!

Ну и вместо конца строки $ потребовалось применить [\r\n] из-за формата обрабатываемого файла.
Ещё раз благодарю за помощь!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования