|
|
|
| Что-то не могу найти правильный вариант, подскажите плз!
Есть текст, состоящий из блоков текста (только из блоков, вне блоков текст отсутствует), которые начинаются с определенных маркеров.
Например так:
Маркеры - А,В,С
Тексты, следующие за этими маркерами, соответственно: text_a, text_b, text_c.
Длина блоков может быть различной. Маркеры окончания блоков отстутствуют (точнее так - начало следующего блока и есть конец предыдущего). Последовательность расположения блоков - произвольная.
Задача: поделить весь текст на блоки для их последующей обработки.
Следущий фрагмент замечательно разделяет текст,
<?
$txt = "..."; // текст из файла
$pattern = "A|B|C";
// делим текст на блоки и сохраняем в массив
$array = split ($pattern, $txt);
?>
|
но в массиве остается текст, не понятно к какому маркеру принадлежащий:
<?
print_r ($array);
?>
результат
[0] => text_?
[1] => text_?
[2] => text_?
|
Как разбить текст, чтобы он содержал в себе и маркер? | |
|
|
|
|
|
|
|
для: 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
)
)
|
| |
|
|
|
|
|
|
|
для: 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 на примерах" пока не привело меня к просветлению =/ | |
|
|
|
|
|
|
|
для: 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>
| как-то так.... | |
|
|
|
|
|
|
|
для: Sfinks
(09.02.2012 в 15:19)
| | Sfinks, да Вы просто монстр в RegExp =)
Огромное человеческое спасибо!
Хотя и пришлось покопаться немного в статьях по регуляркам, чтоб найти "позитивный просмотр вперед" и расшифровать вот это "?:", но главное - удалось получить требуемый результат!
Ну и вместо конца строки $ потребовалось применить [\r\n] из-за формата обрабатываемого файла.
Ещё раз благодарю за помощь! | |
|
|
|