Я использую это регулярное выражение в SSCANF
sscanf($seat, "%d-%[^(](%[^@]@%[^)])");
И это хорошо работает, когда я получаю такие строки:
173-9B([email protected] EUR@32H)
но когда я получаю такую строку:
173-9B(@3.14 EUR@32H)
все перепутано, как я могу принять пустые строки между первым (
и первый @
?
Вы бы лучше использовать регулярное выражение в preg_match
для обработки необязательного наличия данных на входе:
$re = '/(\d*)-([^(]*)\(([^@]*)@([^)]*)\)/';
preg_match($re, '173-9B(@3.45 EUR@32H)', $m);
unset($m[0]);
print_r($m);
Выход:
Array
(
[1] => 173
[2] => 9B
[3] =>
[4] => 3.45 EUR@32H
)
И второй пример:
preg_match($re, '173-9B([email protected] EUR@32H)', $m);
unset($m[0]);
print_r($m);
Array
(
[1] => 173
[2] => 9B
[3] => AA
[4] => 3.45 EUR@32H
)
Использование ([^@]*)
заставит его соответствовать еще 0 символов, которые не являются @
,
Других решений пока нет …