У меня проблема с функцией preg_match_all - PullRequest
1 голос
/ 20 июня 2019

Я не знаю, как получить полный текст строки из этого кода.


$str = '

#chapter 1: title 1

content chapter 1 line 1
content chapter 1 line 2
content chapter 1 line 3
content chapter 1 line 4

#chapter 2: title 2

content chapter 2 line 1

';

preg_match_all('/#Chapter ([0-9]+.?[0-9]?)\s?(<([0-9]+)>)?:(.*)(\s+.+\s+)/i',$str, $match);

Я пробовал этот код, и это выглядит так:

$ match [5] [0]: строка главы 1 контента 1

$ match [5] [1]: строка главы 2 контента 2

проблема в: (\ s +. + \ s +).

Как я могу получить полный контент строки ?!Большое спасибо.

1 Ответ

0 голосов
/ 20 июня 2019

В настоящее время вы соответствуете только одной строке.

Вы можете использовать повторяющийся шаблон, чтобы сопоставить все строки, которые не начинаются с #chapter, используя отрицательный взгляд:

#Chapter\h+\d+:\h+title\h+\d+\K(?:\R(?!#chapter).*)*

Explantion

  • #Chapter Совпадение буквально
  • \h+\d+: Совпадение 1+ горизонтальных пробельных символов, 1+ цифр и :
  • \h+title\h+\d+ Match Match 1+ горизонтальные пробельные символы, title, match 1+ горизонтальные пробельные символы и 1+ цифры
  • \K Забудьте, что было найдено
  • (?: Группа без захвата
    • \R(?!#chapter).* Соответствует юникодной последовательности новой строки и утверждает, что то, что прямо справа, не является # chapter
  • )* Закрыть группу захвата и повторить 0+ раз

Regex demo | Php demo

Например:

preg_match_all('/#Chapter\h+\d+:\h+title\h+\d+\K(?:\R(?!#chapter).*)*/i',$str, $match);
print_r($match[0]);

Результат

Array
(
    [0] => 

content chapter 1 line 1
content chapter 1 line 2
content chapter 1 line 3
content chapter 1 line 4

    [1] => 

content chapter 2 line 1


)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...