我的字符串看起来像是
2009年2月
bla bla
2009年3月
doo daa bla lbla
Septemer 2009
所以我写了这个正则表达式将它分成几个月(这是我想先做的,我认为)
$regex = '/(.*)\s(\d){4}/i';
这完全匹配它们,除了它丢弃它们被拆分的实际字符串..即我想要那些信息(如2009年2月,2009年3月等)
我尝试使用preg_split()
标记,但无法获得我想要的内容。
我应该使用不同的方法吗?是否可以通过正则表达式轻松拆分文本,但保留实际存在的文本?
想想看,我可能会在这里使用`preg_match_all()'...我希望我在答案中没有回答我自己的问题 - 无论如何我要发帖看社区的想法
由于
答案 0 :(得分:3)
将拆分字符串放入其自己的捕获组中。所以举个例子,
$regex = '/(.*)\s(\d){4}/i';
经过一些修改后,成为:
$regex = '/(.+?)(\s)(\d{4})/i';
如果你的匹配数组被称为“$ matches”,$ matches [0]将包含整个匹配,$ matches [1]月,$ matches [2]分裂字符串,$匹配[3]年份
答案 1 :(得分:2)
preg_split的第四个选项是标志:
PREG_SPLIT_DELIM_CAPTURE
如果这样 标志设置,括号表达式 在分隔符模式中 捕获并返回。
$a = preg_split('/(.*\s\d{4})/i', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($a);
打印
Array
(
[0] =>
[1] => February 2009
[2] =>
bla bla
[3] => March 2009
[4] =>
doo daa bla lbla
[5] => Septemer 2009
[6] =>
)
所以非常接近。
答案 2 :(得分:0)
即使没有非贪婪的修饰符'?'
,它看起来也能正常工作preg_match('/(.*)\s(\d{4})/', "Month 2009", $a);
(我想知道为什么因为(。*)应匹配整个字符串,不是吗?)