Viper, можно и одним. Но без доработки результата напильником все равно не обойтись.
Посмотреть можно тут
Вот код:
PHP:
скопировать код в буфер обмена
$string = '[country ln=COUNTRIES][cn=us]США[/cn], [cn=hu]Венгрия[/cn], [cn=ru]Россия[/cn][/country]';
$pattern = '#(?:\[country ln=(.+?)\]|,\s*)\[cn=([a-zA-Z]{2,3})\]([а-яА-ЯёЁ\s]+?)\[\/cn\](?=(?:,\s*|\[\/country\]))#u';
echo $result;
# COUNTRIES: us США, hu Венгрия, ru Россия