=head1 check_rufnummer

Überprüfen und ggf. korrigieren der Syntax einer Rufnummer

=head2 Argumente

=over 4

=item $nr

Rufnummer als String

=item $min_parts

Anzahl der (durch Leerzeichen getrennten) Abschnitte, aus denen die Rufnummer
mindestens bestehen muss, per Default drei.

=item $max_parts

Anzahl der (durch Leerzeichen getrennten) Abschnitte, aus denen die Rufnummer
maximal bestehen darf, per Default vier.

=back

=head2 Ergebnis

Die Rufnummer im korrekten Format, ansonsten C<undef>.

=cut

use utf8;
use strict;
use warnings; no warnings "redefine";

sub check_rufnummer($;$$) {
    my ( $rufnummer, $min_parts, $max_parts ) = @_;

    $rufnummer =~ s/^\+\+/+/;

    # Wenn eine Rufnummer bereits mit einem + beginnt, ist laut Ingo davon
    # auszugehen, dass der Eingebende weiß, was er tut, vgl. #10009446:
    if ( $rufnummer !~ /^\+/ ) {
        $rufnummer =~ s/^00/+/;
        $rufnummer =~ s/^0/+49 /;

        if ( $rufnummer =~ s#\s*/(.*)## ) {
            ( my $nr = $1 ) =~ s/\s+//g;
            $rufnummer .= " $nr";
        }

        $rufnummer =~ s/\s*[\/\-]+\s*/ /g;
    }

    # Wir wissen, dass es zumindest in Deutschland keine mit 0 beginnenden
    # Vorwahlen gibt; bei anderen Ländern sind wir uns da nicht sicher:
    return undef if $rufnummer =~ /^\+49 0/;

    $min_parts = 3 unless $min_parts;
    $max_parts = 4 unless $max_parts;
    --$_ for $min_parts, $max_parts;

    return $rufnummer =~ /^\+[1-9]\d*(?: \d+){$min_parts,$max_parts}$/
      ? $rufnummer
      : undef;
}

1
