PHP preg_match_all захватывает информацию между матчами - PullRequest
1 голос
/ 15 марта 2019

Я не могу понять это. Как мне получить информацию между матчами регулярных выражений? Кажется, моя проблема в том, что в строке есть переводы строки. Если я сожму его до одной строки в «Заголовке», некоторые из моих попыток сработают.

Я хочу вывод, который выглядит следующим образом:

 Array
 (
     [0] => Array
        (
            [0] => Title1#
            [1] => - contenta
            - contentb
        )

    [1] => Array
        (
            [0] => Sometitle2# 
            [1] => - contenta
            - contentb
        )

    [2] => Array
        (
            [0] => ABC3#
            [1] => - asdfasdfasdf
            - random stuff
            more
            something
        )
)

Вот некоторые из моих попыток (я даже попробовал здесь preg_split), например, строка.

<?php
$str = 'Title1#
-contenta
-contentb

Sometitle2# 
-contenta
-contentb
ABC3#
- asdfasdfasdf
- random stuff
more
something';

$re = '/[A-Za-z]{1,10}[0-9]?#\s?(.*\s)/m';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
print_r($matches);

$re = '/([A-Za-z]{1,10}[0-9]?#\s?)/m';
$keywords = preg_split($re, $str,null,PREG_SPLIT_DELIM_CAPTURE);
print_r($keywords);

$parts = preg_split('/([A-Za-z]{1,10}[0-9]?#\s?)/m', $str,null,PREG_SPLIT_DELIM_CAPTURE);
print_r($parts);
?>

Спасибо!

1 Ответ

1 голос
/ 15 марта 2019

Вы можете использовать это регулярное выражение в preg_match_all:

$re = '~(?ms)^([^#\n]+#)\s+(.*?(?=\n+[^#\n]*#\s|\z))~';

Демонстрация RegEx

Подробности RegEx:

  • (?ms): включить режимы MULTILINE и DOTALL
  • ^;Начало строки
  • ([^#\n]+#)\s+: первая группа захвата.Сопоставьте строку, которая заканчивается на #
  • (.*?(?=\n+[^#\n]*#\s|\z)): вторая группа захвата.Совпадение 0 или более символов, которые либо имеют строку с # вперед или \z.

Cude:

$re = '/(?ms)^([^#\n]+#)\s+(.*?(?=\n+[^#\n]*#\s|\z))/';
$str = 'Title1#
-contenta
-contentb

Sometitle2#
-contenta
-contentb
ABC3#
- asdfasdfasdf
- random stuff
more
something';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...