сложный regexp

_Dio_

Новичок
сложный regexp

Может он и не такой сложный, но моя голова уже не соображает.

есть строки такого формата:
бла-бла-бла(дата в формате DD/MM/YYY)опять_мусор(время HH:MM:SS)опять_мусор@Comment: Some Text
Причем последняя часть [@Comment....] может отсутствовать.
надо вытянуть дату/время и коммент

Вот мои правила:
// Time: (([0-1][0-9])|([2][0-3])):([0-5][0-9]):([0-5][0-9])

// Date: ((((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|(29[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))

// Comm: \@Comment\:(.*)$

вместе получаеться
PHP:
$text = preg_match_all("/((((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|(29[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))\.+(([0-1][0-9])|([2][0-3])):([0-5][0-9]):([0-5][0-9])\.+\@Comment\:(.*)$/",$var,$found);
Но вместе почему-то не клеится, где я допустил ошибку.
Заранее спасибо.
 

Silent

Новичок
А почему "Some Text" у тебя в шаблоне представлен как "(.*)",
а "опять_мусор" как "\.+" ?
 

Yukko

Новичок
Вот мои правила:
извини, ты что при помощи РВ дату на валидность проверяешь? или строку на части разбираешь?
Если первое, то его надо делать после второго специальными функциями, а второе делается намного проще, например, что-то типа такого:
^.*(\d{2}\d{2}\d{4}).*(\d{2}:\d{2}:\d{2}).*@Comment:(.*)$
 

_Dio_

Новичок
Проверяю дату на валидность, блин что самое интересное вот этот код
PHP:
<?php

$var = "^098ssdfjh#12/02/2004**%6[10:06:42]fs @Comment: Simple text";
echo preg_match("^.*(\d{2}\/\d{2}\/\d{4}).*(\d{2}:\d{2}:\d{2}).*@Comment:(.*)$",$var,$found);

print_r($found);

?>
не выдает результатов, а RegExpEditor все нормально парсит :(
что не так сделал.

P.S. Первоначально у меня было примерно такой же RegExp :)
 

IntenT

SkyDiver
_Dio_
PHP:
<?php 
$var = "^098ssdfjh#12/02/2004**%6[10:06:42]fs @Comment: Simple text"; 
preg_match("/^.*(\d{2}\/\d{2}\/\d{4}).*?(\d{2}:\d{2}:\d{2}).*@Comment:.*$/",$var,$found); 
echo "<pre>";
print_r($found); 
echo "</pre>";
?>
Вот результат
PHP:
/*
Array
(
    [0] => ^098ssdfjh#12/02/2004**%6[10:06:42]fs @Comment: Simple text
    [1] => 12/02/2004
    [2] => 10:06:42
)

*/
 

_Dio_

Новичок
немного не тот результат :(
о...нашел ошибку вот правильный код
PHP:
echo preg_match("|^.*(\d{2}\/\d{2}\/\d{4}).*(\d{2}:\d{2}:\d{2}).*@Comment:(.*)$|",$var,$found);
и вот результат

Array
(
[0] => ^098ssdfjh#12/02/2004**%6[10:06:42]fs @Comment: Simple text
[1] => 12/02/2004
[2] => 10:06:42
[3] => Simple text
)



-~{}~ 01.03.04 11:01:

иногда отсутствует последняя часть @Comment: Some text

как указать присутствие или отсутствие этой части?
 

Yukko

Новичок
как указать присутствие или отсутствие этой части?
(?:mad:Comment:(.*))?

опять без проверки, но что-то типа такого... надо просто указать при помощи квантификаторов, что это необязательная часть.
 

_Dio_

Новичок
PHP:
<?php

$var = "^92(28/10/2002)**&[19:10:50]@Comment: Text String
^-06/02/2002*$21:55:45
^*13/08/2002*DX145&[22:50:20]@Comment: Text String";

echo preg_match_all("|^.*(\d{2}\/\d{2}\/\d{4}).*(\d{2}:\d{2}:\d{2}).*(?:@Comment: (.*)){0,1}$|mi",$var,$found);
echo "<pre>";
print_r($found);

?>
Что-то я теряю комментарии :(
 

SiMM

Новичок
_Dio_, а {0,1} зачем добавил?
PHP:
echo preg_match_all("|^.*(\d{2}\/\d{2}\/\d{4}).*(\d{2}:\d{2}:\d{2}).*(?:@Comment: (.*))$|mi",$var,$found);
 

_Dio_

Новичок
если ты посмотришь на результат, то увидишь что он пропускает одну строку, которая без коментов.
А надо ее захватывать тоже
 

si

Administrator
preg_match_all("|^.*(\d{2}\/\d{2}\/\d{4}).*(\d{2}:\d{2}:\d{2}).*(?:mad:Comment: (.*))?$|mi",$var,$found);

есть содержимое комента не надо, тогда еще проще

preg_match_all("|^.*(\d{2}\/\d{2}\/\d{4}).*(\d{2}:\d{2}:\d{2}).*$|mi",$var,$found);

-~{}~ 01.03.04 12:28:

\d{2} лучше писать как \d\d (хотя может новые реализации и сами оптимизируют рег к такому виду)
 

_Dio_

Новичок
результат:
Array
(
[0] => Array
(
[0] => ^92(28/10/2002)**&[19:10:50]@Comment: Text String
[1] => ^-06/02/2002*$21:55:45
[2] => ^*13/08/2002*DX145&[22:50:20]@Comment: Text String
)

[1] => Array
(
[0] => 28/10/2002
[1] => 06/02/2002
[2] => 13/08/2002
)

[2] => Array
(
[0] => 19:10:50
[1] => 21:55:45
[2] => 22:50:20
)

[3] => Array
(
[0] =>
[1] =>
[2] =>
)

)
вообще нет там коментов !!!
 

_Dio_

Новичок
Ну конечно, если есть вытягивать дата/время/комент если нет,
только дата/время
 

si

Administrator
<?php

$var = "^92(28/10/2002)**&[19:10:50]@Comment: Text String
^-06/02/2002*$21:55:45
^*13/08/2002*DX145&[22:50:20]@Comment: Text String";

echo preg_match_all("|^.*(\d{2}\/\d{2}\/\d{4}).*(\d{2}:\d{2}:\d{2}).*?(?:mad:Comment: (.*))?$|mi",$var,$found);
echo "<pre>";
print_r($found);

?>

Array
(
[0] => Array
(
[0] => ^92(28/10/2002)**&[19:10:50]@Comment: Text String
[1] => ^-06/02/2002*$21:55:45
[2] => ^*13/08/2002*DX145&[22:50:20]@Comment: Text String
)

[1] => Array
(
[0] => 28/10/2002
[1] => 06/02/2002
[2] => 13/08/2002
)

[2] => Array
(
[0] => 19:10:50
[1] => 21:55:45
[2] => 22:50:20
)

[3] => Array
(
[0] => Text String
[1] =>
[2] => Text String
)

)
 
Сверху