2013-09-25 43 views
0

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

您当前的代码工作正常,并匹配两个字符串。检查[this](http://codepad.org/h0ofNAuO)。但是,在'$ strings'的声明中缺少';'。 –

+0

对于第一个字符串,我需要删除“:: 08.03.2013 - 23.12.2013”​​部分 – WraithLux

+0

做一个输入的例子和准确的预期输出将有很大的帮助... – Enissay

回答

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 " 
+0

谢谢。我以前不知道子模式的语法。 – WraithLux