ISBN-Nummern in Texten finden
Ich wusste bisher nicht, dass man ISBN-Nummern validieren kann. Das macht die Suche in Texten erstaunlich einfach.
Da ich gerade an einer PHP-Bibliothek zur Extraktion von Informationen aus Texten arbeite, hier mal ein kleiner Ausschnitt, nämlich der Teil, mit dem man ISBN-Nummern aus Dateien ziehen kann.
Aufbau von ISBN-Nummern
Zuerst einmal müssen wir uns aber klarmachen, wie ISBN-Nummern aussehen und aufgebaut sind. Es gibt grundsätzlich zwei Typen, ISBN-10 und ISBN-13 mit 10 respektive 13 Ziffern. Dabei können Bindestriche zwischen den einzelnen Gruppen von Ziffern stehen. Beide Typen werden unterschiedlich validiert.
Validierung von ISBN-10
Für ISBN-10 sieht die Formel zur Validierung so aus (\(z_i\) bezeichnet die i-te Ziffer der ISBN-Nummer): \((\sum_{i=1}^{9} i * z_i) \mod 11\)
Nun mag man sich wundern, warum Modulo 11, da dann auch 10 herauskommen kann. Das ist richtig, aber 10 wird dann zu X umgewandelt, sodass eine ISBN-Nummer mit Prüfziffer 10 ein X am Ende stehen hat.
Dabei ist die 10. Ziffer der Nummer die Prüfziffer.
Validierung von ISBN-13
Die Formel für ISBN-13 sieht etwas komplizierter aus (\(z_i\) bezeichnet erneut die i-te Ziffer der ISBN-Nummer): \((10 - (\sum_{i=1}^{12} z_i * 3^{(i+1) \mod 2}) \mod 10) \mod 10\)
Dabei ist die 13. Ziffer der Nummer die Prüfziffer.
Validierung in Code
Wollen wir uns also ansehen, wie die Validierung in PHP-Code aussehen kann. Der Code stammt aus meinem Ansatz zur Extrahierung von ISBN-Nummern in meiner Bibliothek. Deshalb sind hier Klassenmethoden gegeben.
Das ist eigentlich auch schon der wichtigste Teil zum Finden von ISBN-Nummern. Anstatt eines komplizierten Regulären Ausdrucks können wir nun einfach alles heraussuchen, was wie eine ISBN-Nummer aussieht und es auf die Korrektheit der Prüfziffer und die korrekte Länge prüfen.
Bei mir läuft das im Moment so ab:
- einen Whitespace-Tokenizer über den Text laufen lassen, sodass man alle mit Leerzeichen und Ähnlichem abgetrennten Zeichen hat
- jeden einzelnen Token darauf prüfen, ob er nur Ziffern, Bindestriche und X (wichtig!) enthält
- die verdächtigen Ergebnisse anhand der Ziffernlänge (ohne Bindestriche) und eventuell auch noch der Prüfsumme validieren
Schon hat man ISBN-Nummern gefunden.
I do not maintain a comments section. If you have any questions or comments regarding my posts, please do not hesitate to send me an e-mail to blog@stefan-koch.name.