Toon posts:

[ASP.NET] Regex.Replace

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ooit heb ik eens een klassiek asp guestbook geschreven. Als een gebruiker een bericht postte met daarin een link, dan kon het script automatisch de anchor tags aan de link toevoegen. Dus als een gebruiker iets postte als www.mijnsite.com dan maakte mijn script daar automatisch http://www.mijnsite.com van.

Dat deed ik allemaal met erg omslachtige search en replace functies. Maar het werkte verder allemaal prima.

Onlangs heb ik de overstap gemaakt naar asp.net, en ben ik dit guestbook aan het herschrijven. Nu wil ik van regular expressions gebruik gaan maken. Gisteravond heb ik me hier voor het eerst in verdiept, en dit is mijn eerste simpele expressie geworden: (?<match>(http://|http://www\.|www.)([a-zA-Z.])+)

Ik weet het, deze expressie kan beter ;) Maar afijn, dit was om te testen..

Nu heb ik dus gekeken naar de regex classes, maar ik begrijp het allemaal nog niet zo goed. Wat ik nodig heb is een simpel stukje code wat een string doorzoekt en automatisch aan de links in die string anchor tags toevoegd.

Bijvoorbeeld:

strInput = "bla bla bla http://tweakers.net bla bla www.microsoft.com bla bla blaat"
strOutput = "bla bla bla <a href="http://www.tweakers.net">http://www.tweakers.net</a> bla bla <a href="http://www.microsoft.com">http://www.microsoft.com</a> bla bla blaat"

Nu weet ik dat ik in die expressie dat <match> voor dit doeleinde kan gebruiken. Ik heb immers de originele link nodig, ik kan hem niet simpelweg replacen met iets anders.

Heeft er iemand een stukje code voorbeeld in asp.net VB hoe ik dit zou moeten doen?

*** Sorry ***

Heb me al heel de avond sufgezocht, maar het uiteindelijk toch nog gevonden... En het is zo simpel:

Dim strOutput As String = Regex.Replace( source, find, "<a href=""${match}"">${match}</a>")

[ Voor 21% gewijzigd door Verwijderd op 03-09-2004 01:08 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Omdat je het blijkbaar toch al opgelost hebt ga ik toch even wat commentaar geven op je regexp. :)
(?<match>(http://|http://www\.|www.)([a-zA-Z.])+)
Waarom haakjes om het geheel heen? Waarom ?<match> in het begin? Waarom een aparte check voor http://www. als http:// al herkend wordt? Waarom escape je de ene punt achter www wel, en de andere niet? Wat als er cijfers in de URL voorkomen, of slashes, streepjes, underscores? Waarom niet nog een laatste extra check om te kijken of er wel iets als .com of .nl achter staat?
En sowieso moet je dit alleen aan het begin/eind van een regel, en tussen whitespace karakters matchen.

[/mierenneukmodus] :)

[ Voor 11% gewijzigd door NMe op 03-09-2004 01:21 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
(?<match>(http://|http://www\.|www.)([a-zA-Z.])+)

Waarom haakjes om het geheel heen? Waarom ?<match> in het begin?

Ik wil dus niet alleen weten of er een match is (isMatch) maar ook wat de inhoud van die match is. De inhoud wordt dus opgeslagen in dat ?<match>.
Volgens mij geeft match alles terug wat tussen de haakjes staat, daarom staan er dus haakjes om het geheel heen. Ik (denk) dat de expressie niet werkt als ik ze zou weglaten.

Waarom een aparte check voor http://www. als http:// al herkend wordt?

Omdat niet iedereen altijd netjes een echte url post (www.mijnsite.com in plaats van http://www.mijnsite.com) Ik denk dat ik dit beter zou kunnen oplossen, maar weet (nog) niet hoe ik de syntax daarvoor moet schrijven.

Waarom escape je de ene punt achter www wel, en de andere niet?
Da's inderdaad een foutje.. de 2e punt moet ook een escape hebben.

Wat als er cijfers in de URL voorkomen, of slashes, streepjes, underscores?
Waarom niet nog een laatste extra check om te kijken of er wel iets als .com of .nl achter staat?


Omdat dit dus slechts een test was, was ik daar nog niet aan toegekomen. Zowiezo natuurlijk uitbreiden met de slashes, streepjes en underscores, en waarschijnlijk ook checken op de standaard domeinnamen. Maar, een volgende link moet ook kunnen werken: http://www.site.com/pagina.aspx?pagina=10&nr=18#bla

Zou dit mogelijk zijn in combinatie met een check of er wel een domeinnaam aanwezig is?? Aangezien de domeinnaam dus niet op het einde staat in bovenstaand voorbeeld.

En sowieso moet je dit alleen aan het begin/eind van een regel, en tussen whitespace karakters matchen.
Tussen whitespace natuurlijk altijd... maar hoe zit dat met het begin/eind van een regel? Kan je dat nader toelichten?

In het ideale geval zou de regex het volgende moeten kunnen:
http:// ftp:// (en alle overige versies) herkennen.

Als een gebruiker alleen www.site.com post, dan zou de uiteindelijke link moeten worden <a href="http://www.site.com">http://www.site.com</a>, dus niet <a href="http://www.site.com">www.site.com</a>. Ik denk dat ik daarvoor iets met een matchcollection moet gaan doen ofzo... Verder moet ie inderdaad checken op whitespace, waarschijnlijk uitbreiden met /s uit mijn hoofd...

Commentaar en voorbeelden zijn natuurlijk welkom ;)

[ Voor 24% gewijzigd door Verwijderd op 03-09-2004 02:10 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 03 september 2004 @ 02:03:
Omdat niet iedereen altijd netjes een echte url post (www.mijnsite.com in plaats van http://www.mijnsite.com) Ik denk dat ik dit beter zou kunnen oplossen, maar weet (nog) niet hoe ik de syntax daarvoor moet schrijven.
Ik doelde op het feit dat je matcht op http://, www. en http://www., lijkt me een beetje overkill. ;)
Omdat dit dus slechts een test was, was ik daar nog niet aan toegekomen. Zowiezo natuurlijk uitbreiden met de slashes, streepjes en underscores, en waarschijnlijk ook checken op de standaard domeinnamen. Maar, een volgende link moet ook kunnen werken: http://www.site.com/pagina.aspx?pagina=10&nr=18#bla

Zou dit mogelijk zijn in combinatie met een check of er wel een domeinnaam aanwezig is?? Aangezien de domeinnaam dus niet op het einde staat in bovenstaand voorbeeld.
Mogelijk is het sowieso. Denk aan zoiets:
code:
1
2
3
4
5
6
7
8
^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]
+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1
}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9
]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1
}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1
-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.[a-
zA-Z]{2,4})(\:[0-9]+)?(/[^/][a-zA-Z0-9\.\,\?\'\\/\+&%\$#\=~_
\-]*)*$

Of zoiets als je alles bij naam wil hebben:
code:
1
2
3
4
5
6
7
8
(?:(?<protocol>http(?:s?)|ftp)(?:\:\/\/))
(?:(?<usrpwd>\w+\:\w+)(?:\@))?
(?<domain>[^/\r\n\:]+)?
(?<port>\:\d+)?
(?<path>(?:\/.*)*\/)?
(?<filename>.*?\.(?<ext>\w{2,4}))?
(?<qrystr>\??(?:\w+\=[^\#]+)(?:\&?\w+\=\w+)*)*
(?<bkmrk>\#.*)?

Beide regexps zijn schaamteloos overgenomen van www.regexplib.com :P
Tussen whitespace natuurlijk altijd... maar hoe zit dat met het begin/eind van een regel? Kan je dat nader toelichten?
^ matcht het begin van de regel, $ het einde. Als de url het begin van een zin is, of het einde, dan moet ie natuurlijk ook matchen. Een andere uitdaging is het opletten dat leestekens aan het einde niet meegenomen moeten worden, dus www.test.com, en niet [url]www.test.com.[/] :)
In het ideale geval zou de regex het volgende moeten kunnen:
http:// ftp:// (en alle overige versies) herkennen.

Als een gebruiker alleen www.site.com post, dan zou de uiteindelijke link moeten worden <a href="http://www.site.com">http://www.site.com</a>, dus niet <a href="http://www.site.com">www.site.com</a>. Ik denk dat ik daarvoor iets met een matchcollection moet gaan doen ofzo... Verder moet ie inderdaad checken op whitespace, waarschijnlijk uitbreiden met /s uit mijn hoofd...
Sowieso is het \s en niet /s. ;) Ik denk ook dat je met bovengenoemde regexps een heel eind gaat komen. :)
Commentaar en voorbeelden zijn natuurlijk welkom ;)
Bij dezen. :)

Overigens wist ik dat van het benoemen van een deel van de regexp niet, weer wat geleerd. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Thanks voor je commentaar... regexlib had ik al ontdekt, maar van zelf experimenteren leer je natuurlijk het meest ;)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 03 september 2004 @ 23:24:
Thanks voor je commentaar... regexlib had ik al ontdekt, maar van zelf experimenteren leer je natuurlijk het meest ;)
Uiteraard, maar een perfect werkende regexp voor urls is vrij lastig omdat je dus met zoveel dingen rekening moet houden, en daarom is het vaak "beter goed gejat, dan slecht verzonnen". De twee die ik noemde zullen waarschijnlijk ook niet waterdicht zijn.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1