Avatar billede gargantua Nybegynder
29. maj 2007 - 13:24 Der er 9 kommentarer

Hvordan finder man danske telefonnumre i en websides HTML tekst

Hej,
jeg skal udvikle et program der skal udtrække danske telefonnumre, fra et HTML dokument. Til det formål vil jeg bruge en regex og scanne html-siden igennem.

Jeg har foreløbigt lavet en regex der hedder:

((\(?\+45\)?)?)(\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2})

Den første del af regex'et skulle virke hvis der står +45 foran telefonnummeret. Desuden er der optional mellemrum mellem hvert to talpar.

Den virker desværre kun på ganske få websider. De fleste steder jeg prøver, får jeg en masse tal som ikke er telefonnumre:
Fra comon.dk's hjemmeside fx 11800986.

Er der nogen som kan gennemskue hvad der er galt i mit regex?

Superglad for al hjælp jeg kan få,
Hilsen
Jens
Avatar billede roenving Novice
29. maj 2007 - 13:34 #1
Kunne du ikke sætte word-boundary på (\b ?-)
Avatar billede pidgeot Nybegynder
29. maj 2007 - 13:36 #2
Det er jo svært helt at undgå, da 8-cifrede tal jo kan være hvad som helst, men du kunne jo starte med at filtrere det fra der IKKE kan være gyldige telefonnumre - dem der starter med 0 eller 1:

((\(?\+45\)?)?)(\s?[2-9]\d\s?\d{2}\s?\d{2}\s?\d{2})

Husk dog lige på at der også er nogle der skriver dem som 87 654 321, og det fanger den jo heller ikke.

Det var måske også en god ide at lægge noget lookahead/lookbehind ind så du ikke fanger noget der er en del af en attribut i et tag, men det er ikke noget jeg lige kan lave i hovedet, og jeg har ikke den software jeg normalt bruger til at lave regexes tilgængelig lige nu.
Avatar billede gargantua Nybegynder
29. maj 2007 - 17:28 #3
Hej roenvig,
hvad mener du med word-booundary. Hvad er det \b? gør. Jeg er lidt ny i regex verdenen.

Pidgeot, det var smart at filtere 1 og 2 fra. Det havde jeg ikke tænkt på. Lookahead og lookbehind, der er jeg igen stået lidt af. Kan du give et eksempel når du har din software tilgængelig? Tak.

Jens
Avatar billede roenving Novice
29. maj 2007 - 17:37 #4
\b\d+\b vil matche 987876, men ikke kb854578, da der er angivet ordgrænse både før og efter tallet, og det er der jo ikke i det andet !-)
Avatar billede gargantua Nybegynder
29. maj 2007 - 17:53 #5
Okay, smart.
Avatar billede pidgeot Nybegynder
29. maj 2007 - 21:39 #6
Nu er det jo et HTML-dokument, så vi kan faktisk lave det ved at sige det skal optræde mellem et > og et <.

Hvis vi tager \b'erne med, bliver det til dette:
>[^<]*?\b(\(?\+45\)?)(\s?[2-9]\d\s?\d{2}\s?\d{2}\s?\d{2})\b[^>]*?<

Med mindre du rent faktisk vil kunne vide om +45 var med, kan det også gøres sådan her, så du kun har en capturing group:

>[^<]*?\b(?:\(?\+45\)?)?(\s?[2-9]\d\s?\d{2}\s?\d{2}\s?\d{2})\b[^>]*?<

Og hvis vi lige tager xx xxx xxx med, bliver det sådan her:

>[^<]*?\b(?:\(?\+45\)?)?(\s?[2-9]\d\s?(?:\d{2}\s?\d{2}\s?\d{2}|\s?\d{3}\s?\d{3}))\b[^>]*?<

Til sidst napper vi den alligevel lige med lookahead/lookbehind:

(?<=[^<]*>)\b(?:\(?\+45\)?)?(\s?[2-9]\d\s?(?:\d{2}\s?\d{2}\s?\d{2}|\s?\d{3}\s?\d{3}))\b(?=[^>]*<)
Avatar billede gargantua Nybegynder
30. maj 2007 - 09:23 #7
Hej pidgeot,
nu er der bare det problem at html sider ofte ikke er statiske, dvs der optræder ikke altid et > og et <. Hos De Gule Sider bliver resultatet af en søgning fx:

...<a href="blabla;city=København Ø&phone=77326070&cell=..."/>

Så denne version skal jeg også have fanget. Umiddelbart er en nem måde at fange nummeret på måske bare:

\b\d[2-9]\d{6}\b

oder was? (Fatter iøvrigt ikke der skal stå 6 i tuborgklammerne, og ikke 7?)
Avatar billede roenving Novice
30. maj 2007 - 16:04 #8
Måske:

\b(\d[2-9][\d ]{7,})\b -- men den vil også acceptere flere end 8 cifre ialt ...

-- der skal vel stå 7 ?-)
Avatar billede roenving Novice
30. maj 2007 - 16:06 #9
Argh ...

\b([2-9][\d ]{7,})\b

-- der skulle stå 6, fordi der var 2 tegn foran ( \d og [2-9] !-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester