你可以用正则表达式在PHP中拆分一个字符串,但是很容易得到分割字符串的匹配字符串吗?

时间:2009-06-08 00:09:01

标签: php regex

我的字符串看起来像是

  

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()'...我希望我在答案中没有回答我自己的问题 - 无论如何我要发帖看社区的想法

由于

3 个答案:

答案 0 :(得分:3)

将拆分字符串放入其自己的捕获组中。所以举个例子,

$regex = '/(.*)\s(\d){4}/i';
经过一些修改后,

成为:

$regex = '/(.+?)(\s)(\d{4})/i';

如果你的匹配数组被称为“$ matches”,$ matches [0]将包含整个匹配,$ matches [1]月,$ matches [2]分裂字符串,$匹配[3]年份

答案 1 :(得分:2)

preg_split的第四个选项是标志:

http://www.php.net/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);

(我想知道为什么因为(。*)应匹配整个字符串,不是吗?)