我不知道这一点。如何获取正则表达式匹配项之间的信息? 我的问题似乎是字符串中包含换行符。如果我将每个“标题”压缩为一行,则我的某些尝试会起作用。
我想要一个看起来像这样的输出:
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);
?>
谢谢!
答案 0 :(得分:1)
您可以在preg_match_all
中使用此正则表达式:
$re = '~(?ms)^([^#\n]+#)\s+(.*?(?=\n+[^#\n]*#\s|\z))~';
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);