Sieht gut aus.
Allerdings bin ich mir nicht so sicher, ob da wirklich alle Regeln miteinbezogen sind. Die Funktion liefert auch für leere und falsch verkürzte Strings true. ('' oder '0000:fff')
Ich hatte in der Zwischenzeit auch angefangen, eine eigene Funktion zu schreiben. Die ist definitiv nicht so kurz und schnell wie Deine, weil ich quasi für jede Regel auf eine eigene Prüfung zurückgreife, aber letztlich hängt es bei mir gerade auch an der vollständigen Regeldefinition. Damit habe ich u.A. das gleiche Problem, was ich gerade bei dir angemerkt habe.
Delphi-Quellcode:
if //nicht länger als 39 Stellen 8*4+7
(length(myIPv6) <= 39) and
// max. ein Mal ::
(CountPos('::', myIPv6) <= 1) and
// nur 0-F und :
(ValidCharsInString(myIPv6, ['0'..'9', 'A'..'F', 'a'..'f', ':'])) and
// zwischen : und : max. 4 Stellen
(MaxSubStringLength(myIPv6, ':') <=4)
then
Der Übersicht halber erspare ich mir hier den Inhalt der einzelnen Funktionen (bei Interesse kann ich sie natürlich auch noch posten).
Da ich den String nicht wie in Deiner SJCheckIPv6 in einem Durchgang Zeichen für Zeichen überprüfe, könnte ich weitere Prüfungen im Ganzen anhängen. Dafür fehlt es mir momentan aber an der Regel-Definition:
- Kürzest-mögliche Adresse (von
localhost abgesehen)?
- Eventuell nur bestimmter Anfang der Adresse gültig (je nach Einer-Bitfolge) wie 2000, fc00, fe80, ff00?
- Sofern kein :: vorkommt, müssten es wohl 8 Blöcke bzw. 7 : sein
- ...
Ich befürchte einfach, dass das alles keine 100%ige Prüfung darstellt. Etwas besseres fällt mir aber auch nicht ein...