PHP preg_match_all在比赛之间获取信息

时间:2019-03-15 09:39:25

标签: php regex

我不知道这一点。如何获取正则表达式匹配项之间的信息? 我的问题似乎是字符串中包含换行符。如果我将每个“标题”压缩为一行,则我的某些尝试会起作用。

我想要一个看起来像这样的输出:

 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 个答案:

答案 0 :(得分:1)

您可以在preg_match_all中使用此正则表达式:

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

RegEx Demo

RegEx详细信息:

  • (?ms):启用多行和点播模式
  • ^;行开始
  • ([^#\n]+#)\s+:第一个捕获组。匹配以#
  • 结尾的行
  • (.*?(?=\n+[^#\n]*#\s|\z)):第二个捕获组。匹配0个或多个前面带有#或\z的字符。

提示:

$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);