我的preg_match_all函数有问题

时间:2019-06-20 08:59:57

标签: php regex

我不知道如何从这段代码中获取全部内容。


$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行

(\ s +。+ \ s +)处的问题。

我如何获得全部内容?非常感谢。

1 个答案:

答案 0 :(得分:0)

当前您只匹配一行。

您可以使用重复模式使用负前瞻来匹配所有以#chapter开头的行:

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

外植

  • #Chapter字面上匹配
  • \h+\d+:匹配1个以上水平空格字符,1个以上数字和:
  • \h+title\h+\d+匹配匹配1个以上水平空白字符,title,匹配1个以上水平空白字符和1个以上数字
  • \K忘记匹配的内容
  • (?:非捕获组
    • \R(?!#chapter).*匹配unicode换行符序列并断言直接在右侧的不是#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


)