2013-09-25 42 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