06. maj 2004 - 23:14Der er
36 kommentarer og 3 løsninger
URL tjek med regular expression
Hi E,
Jeg har længe kigget efter et reg exp udtryk, som kunne validere en URL. Det har ikke været nemt, så jeg prøver nu at sætte noget sammen, men vil meget gerne have lidt hjælp, da jeg ikke er den største haj til reg exp (endnu ;-).
Jeg har forsøgt at opdele udtrykket i de enkelte bestanddele:
IP-nummer (modificeret fra http://www.regexlib.com): 25[0-5]|2[0-4]\n|1\n\n|[1-9]\n|\n)\.){3}(25[0-5]|2[0-4]\n|1\n\n|[1-9]\n|\n
Typer af 'endelser': (\:\d+)* (\/\~?\w+)* \/? (\/\w+\.\w{2,5})? ([\+\.\,\-\?\&\%\#\=\$]\w+)*
Det samlede udtryk bliver så på formen: /^protokol(domæne|IPnummer)endelser$/i
Er der nogen af de skarpe reg exp hoveder der kan gennemskue om jeg har fået det hele med, om det kan gøres mere elegant eller om der er decideret fejl i udtrykket. Der gives point til alle, der efter min mening forbedrer udtrykket (eller har et helt andet og bedre alternativ).
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
Cifre hedder \d (digit) og ikke \n (som er nylinje !-)
-- og så må man jo idag bruge alle mulige tegn, så jeg bruger denne som matrix (her i javascript !-)
var t = "\\wáàãââæåçéèêëìíîïñòóôõöøùúûüýÿ"; var regexp = new RegExp("^["+t+"]["+t+"\\.\\-]*@["+t+"]["+t+"\\.\\-]*\\.["+t+"]{2}["+t+"\\.\\-\\/]*$","i");
\\er fordi du skal følge streng-regler, når man opstiller en regExp med new RegExp, så en enkelt \ vil være en escape af det næste tegn, før det sendes videre til fortolkning ...
Da \w er et speciel-tegn, som skal sendes sådan til regExp'en, skal vi altså escape \-tegnet, derfor to ...
var t = "\\wáàãââæåçéèêëìíîïñòóôõöøùúûüýÿ"; var urlReg = new RegExp("^(http|https|ftp)\\:\\/\\/([" + t + "]+([\\.\\-][" + t + "]+)*\\.[A-Za-z]{2,6}|(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.{3}(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))((\\:\\d+)*|(\\/\\~?[" + t + "]+)*|\\/?|(\\/[" + t + "]+\\.[" + t + "]{2,5})?|([\\+\\.\\,\\-\\?\\&\\%\\#\\=\\$][" + t + "]+)*)");
Ja, det skal jeg godt nok love for! btw. URL'en http://domain.dk/?param=value bliver ikke godkendt af udtrykket, så en tilføjelse er vis på sin plads. Desuden har jeg fundet et par andre fejl, så jeg bakser nok videre på den 'i morgen'.
Efter at have brugt mere end en ½ time på at debugge bare oprettelsen af regexp'en, nåede jeg ikke så meget mere, så jeg testede kun lige en indlysende tavetosse ...
-- og det så jeg lige: $-tegnet mangler i slutningen !-)
-- iøvrigt kan man gøre den simplere at debugge, ved ikke at bruge t-variablen, men indsætte ækvivalenten direkte alle 6 gange, men den bliver ik' li'e kortere af det !o]
Så tror jeg, jeg er kommet et par skridt nærmere. Jeg har dog (endnu) ikke implementeret de specielle tegn, men det kan man jo enten gøre på den ene eller den anden måde, som du skriver roenving.
Samlet bliver det (hold fast): /^(http|https|ftp)\:\/\/((\w+([\.\-]\w+)*\.[A-Za-z]{2,6})|(((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)))(\:\d+)?(\/\~?\w+)*((\/|\/\w+\.\w{2,5})?((\?\w+\=[\+\.\,\-\?\&\%\#\=\$\w]*)?))$/i
Ja, (\/\w+\.\w{2,5})? refererer til et filnavn, og du har ret i, at der kan forekommer andre tegn i filnavnet også - jeg tror jeg mest har tænkt på index.htm og lign. filer, da jeg lavede den del af udtrykket, men det er jo for begrænset. Måske er dette bedre (kunne kun lige komme i tanke om bindestregen - er der andre karakterer der ville kunne optræde i et filnavn?): (\/[\-\w]+\.\w{2,5})?
Tjoe - fx i en URL til et pdf dokument. Du godeste, så er der jo mange muligheder. Argh. Men men, hvis man snakker om en URL til en internetside (og ikke en fil, der skal åbnes med en ekstern applikation) er det vel kun [\-\w]+ som er relevant, eller?
Deep nestede filnavn er med ( (\/\~?[\-\w]+)* efterfulgt af ((\/|\/\w+\.\w{2,5})?...) ). Extension kan være på 2-5 tegn, men en .shtmlx fil ville ikke gå igennem, men det er jo blot et spm om at sætte {2,5} til {2,6} - eller mere hvis det er nødvendigt.
...og så må jeg jo heller inkludere %... muligheden i udtrykket også - og det kan jo så i princippet både være i foldernavn og filnavn (selvom det ville være en noget uhensigtsmæssigt URL) :-/
Yaiks! Nu bli'r det langhåret (og jeg er ved at miste overblikket... Bliver det så ikke noget i retningen af [(\%[\da-f]{2})\w]+ Et mellemrum kunne jo godt risikere at optræde flere gange i et fil- eller foldernavn.
Ja, den med querystringen skal lige udvides lidt - det har du ret i. Noget i retningen af: (\?\w+\=[\/\+\.\,\:\;\-\?\&\%\#\=\$\w]*)? eller kunne man i virkeligheden bare skrive: (\?[\W\w]+\=[\W\w]*)?
Jeg har ikke glemt jer... Vender tilbage snarest! Kan I ikke i mellemtiden begge give et svar, så pointuddelingen kan ske umiddelbart efter spm er lukket.
Kun lidt 'krummer' til mig, tak. Jeg er jo som sædvanligt ikke stået til søs, men har ladt de andre stå ... og så kæftet lidt op fra sidelinien ;D /mvh
Kære roenving og olebole, jeg har ikke haft computer med internetadgang i nogle (!) måneder, så jeg har selvsagt ikke været på eksperten i en rum tid - jeg beklager, at dette spm har hængt, men jeg vil så afslutte det nu.
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.