Sscanf с регулярным выражением для соответствия даже пустой строке

Я использую это регулярное выражение в SSCANF

sscanf($seat, "%d-%[^(](%[^@]@%[^)])");

И это хорошо работает, когда я получаю такие строки:
173-9B([email protected] EUR@32H)
но когда я получаю такую ​​строку:
173-9B(@3.14 EUR@32H)

все перепутано, как я могу принять пустые строки между первым ( и первый @ ?

1

Решение

Вы бы лучше использовать регулярное выражение в 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 символов, которые не являются @,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]