正则表达式,创建子模式

时间:2013-09-25 13:54:17

标签: php regex

我有两个字符串,我必须从中提取数据。我使用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 ""

1 个答案:

答案 0 :(得分:2)

您的代码应该是这样的:

$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 "