正则表达式,创建子模式


Regular expression, creating subpattern

我有两个字符串必须从中提取数据。我用preg_replace来做到这一点。但是,我不确定如何使最后一个's':':可以匹配或不匹配。我尝试了{0,},但后来它与第一个字符串不匹配,没有它,最后一个字符串就不匹配。

$strings = array(
    '13.02 - foobar1 bla bla :: 08.03.2013 - 23.12.2013',
    '06.05 21:00 - " foobar2 bla bla "',
)
foreach($strings as $data){
    $pattern = '/^('d){2}'.('d){2}'s?('d){0,2}(':)?('d){0,2}'s'-(.*)('s':':.*)?/i';
    echo preg_replace($pattern, '$6', $data);
}

我希望得到这两个字符串作为最终输出:

"foobar1 bla bla"
"" foobar2 bla bla ""

你的代码应该是这样的:

$strings = array(
'13.02 - foobar1 bla bla :: 08.03.2013 - 23.12.2013',
'06.05 21:00 - " foobar2 bla bla "',
);
foreach($strings as $data){
$pattern = '/'d{2}'.'d{2}(?:'s'd{2}:'d{2})?'s-'s(.*?)(?:'s::|$).*/';
echo preg_replace($pattern, '$1', $data) . "'r'n<br>";
}

它将输出:

foobar1 bla bla 
" foobar2 bla bla "