preg_match_all текст между строками изменения

Мне нужно было бы получить текст между определенными строками с помощью preg_match_all. Я пробовал использовать чередование, но не получаю нужной информации. Мне нужно получить случайный текст между строками дня недели. С пятницы он должен идти до конца текста.

Мои данные следующие:

Monday 1.1.
randomtext
randomtext
Tuesday 2.1.
randomtext
randomtext
Wednesday 3.1
randomtext
randomtext
Thusday 4.1.
randomtext
randomtext
randomtext
Friday 5.1
randomtext
randomtext

Теперь у меня есть следующее, но он захватывает материал только после понедельника, когда он должен остановиться на вторник, а затем сделать это снова:

/(Monday|Tuesday|Wednesday|Thursday|Friday)([\s\S]+)/

Любые идеи?


person Kemu79    schedule 17.07.2012    source источник


Ответы (3)


Вы можете использовать preg_split().

$day_pattern = '/([a-z]+?day [\d\.]+\n)/i';
$bits = preg_split(
    $day_pattern,
    $str,
    null,
    PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE
);
if ($bits)
    foreach($bits as $bit)
        echo preg_match($day_pattern, $bit)
            ?
            '<h3>'.$bit.'</h3>'
            :
            '<p>'.$bit.'</p>';

Выходы

<h3>Monday 1.1.</h3>
<p>randomtext
randomtext</p>
<h3>Tuesday 2.1.</h3>
<p>randomtext
randomtext</p>
<h3>Wednesday 3.1</h3>
<p>randomtext
randomtext</p>
<h3>Thusday 4.1.</h3>
<p>randomtext
randomtext
randomtext</p>
<h3>Friday 5.1</h3>
<p>randomtext
randomtext</p>
person Mitya    schedule 17.07.2012

Попробуйте это, используйте модификатор m и _2 _ + _ 3_, чтобы сопоставить каждую строку вашего текста.

$datas = <<<data
Monday 1.1.
randomtext
randomtext
Tuesday 2.1.
randomtext
randomtext
Wednesday 3.1
randomtext
randomtext
Thusday 4.1.
randomtext
randomtext
randomtext
Friday 5.1
randomtext
randomtext
data;
preg_match_all('#^(?!Monday|Tuesday|Wednesday|Thusday|Friday)\w+$#im',$datas,$matches);
print_r($matches);
person Lake    schedule 17.07.2012

В вашем примере на самом деле «Случайный текст ....» не находится между определенной строкой, поскольку в нем отсутствует строка в конце, то есть после пятницы

Monday 1.1.
randomtext1
randomtext2
Tuesday 2.1.
randomtext3
randomtext4
Wednesday 3.1
randomtext5
randomtext6
Thursday 4.1.
randomtext7
randomtext8
randomtext9
Friday 5.1
randomtext10
randomtext11
Monday

Если текст будет таким, как указано выше, т.е. он всегда будет между строкой дня недели, вы можете использовать следующий шаблон.

 (?<=Monday|Tuesday|Wednesday|Thursday|Friday)([\s\S]+?)(?=Monday|Tuesday|Wednesday|Thursday|Friday)
person Jithin    schedule 17.07.2012