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

Ваш текущий код работает нормально и соответствует строкам. Проверьте [это] (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

Смежные вопросы