Jesper Stocholm wrote:
> Lasse Reichstein Nielsen wrote:
>>>
>>>Jeg sidder og er ved at skrive et RegExp til at matche en URI. Kravene
>>>til det er at det skal kunne håndtere http(s) og ftp-adresser samt
>>>underfoldere og filer. Det skal udskifte alle forekomster hvor et
>>>match forekommer.
>>>
>>Du mener måske:
>> re = /(((http|https|ftp):\/\/)?\w+[.\w]+[^\w]*)/
>
> Det hjalp i hvert fald lidt ad vejen ...
>
> Resultatet af replace ser dog stadig lidt mystisk ud. Det ser ud til at den
> mangler at kigge på whitespace før URI og whitespace efter URI.
>
> Jeg har lagt det eksempel jeg sidder og arbejder med op på
>
www.stocholm.dk/test/html/replace.html, hvor resultatet kan ses.
Filen hedder nu regexp.html
<URL:
http://www.stocholm.dk/test/html/regexp.html>
> Umiddelbart vil jeg tro det skulle ændres til
> re = new RegExp('(((http|https|ftp):\/\/)?\w+[.\w]+([^\w]*[\s]+))');
> ---------------------------------------------------^------^^^^^^----
Der er forskel på at angive mønstret mellem /'er og som streng. Lasse
bruger /'er, så du skal huske at lave alle backslashes til
dobbelt-backslashes når du skriver det som streng. Måske er det grunden
til de lidt mærkelige resultater det giver :)
Jeg ville foreslå denne:
[Beklager at linierne er for lange til ikke at blive ombrudt, men kopier
det over i en notepad]
re = new
RegExp(/(((http|https|ftp):\/\/)?[\wæøåÆØÅ\.\-]+\.[A-Za-z]{1,5}(\/[\w\.\/\-]*(\?\S*)?)?)/g);
// Protokol -----^^^^^^^^^^^^^^^^^^^^^^^^^
// Domæne --------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// muligvis noget efter domænet
----------------------------------------^----------------------^^
// mulige undermapper og filnavn (indledes med / hvis der er noget)
-----^^^^^^^^^^^^^
// mulig querystring (indledes med ? hvis der er noget)
------------------------------^^^^^^^^^
Jeg tillader æøå i domæner (ikke TLD) og TLD kan være fra 1 til 5
bogstaver. Bemærk også at der kan være bindestreg og punktum i domænet,
og \w matcher ikke disse to tegn.
Det sværeste ved ovenstående er at finde ud af hvornår man skal slutte,
for ofte skrives querystringen ikke urlencoded (escape() i javascript)
og kan derfor indeholde alle tegn. Jeg har sagt at første gang man
kommer til tegnene i \s så stopper vi, det er primært mellemrum,
linieskift og tabulatorer
Bemærk også at jeg angiver et g efter /...../, det angiver global
søgning, dvs man skal finde alle matches og ikke bare det første.
mvh Torben