Zásada pro zobrazovánà uživatelského vstupu je prostá – být pÅ™ipraven na cokoli. VyzkouÅ¡ej si, jak dopadne tvoje návÅ¡tÄ›vnà kniha (nebo jiná aplikace zobrazujÃcà uživatelský vstup), když jà pÅ™edhodÃÅ¡ trochu nároÄnÄ›jšà sousto (ASC, 3 kB) – změť záludných znaků, prapodivných odkazů a důmyslnÄ› sestavených mezer. Budu rád za vÅ¡echny nápady na rozÅ¡ÃÅ™enà testovacÃho souboru.
NÄ›které vÄ›ci nemůžeme oÅ¡etÅ™it úplnÄ›, jako tÅ™eba nalezenà hypertextového odkazu. Tady nezbývá, než se spolehnout, že uživatel uvede i protokol http://. Pokud totiž chceme najÃt i odkazy bez protokolu, musÃme hledat vzor www.Å™etÄ›zec.Å™etÄ›zec. Ne vÅ¡echny odkazy ovÅ¡em zaÄÃnajà řetÄ›zcem www., takže nakonec vycházà vzor Å™etÄ›zec.Å™etÄ›zec, a to bysme mÄ›li odkaz z každých dvou slov oddÄ›lených teÄkou.
V komentářÃch je ukázka, jak se s testovacÃm vstupem (ne)?poprala moje aplikace.
Ahoj Honzo,
jsem na Tvém blogu poprvé (dostal jsem se sem pÅ™es MS IE10 PP gradient tool, ke kterému Ti gratuluji) a zatÃm se mi zde velice lÃbÃ.
Zejména tento pÅ™ÃspÄ›vek o zpracovánà volného textového vstupu a Tvůj testovacà soubor mi pomohly vyladit můj odkazy-hledajÃcà regex v mém online notepadu – zápisnÃku http://scribz.net/ . Tam dovoluji lidem zaznamenávat jakékoli texty jako do plain-text editoru, a potom jim dynamicky servÃruji odkazy pro lehký pÅ™Ãstup. Proto umÃm velice dobÅ™e pochopit, jak je těžké „uhodnout“, co je legitimnà odkaz a co nenÃ.
Co se týÄe Tvého pÅ™Ãkladu, urÄitÄ› bych nerozeznával ‚<‘ a ‚>‘ jako platné znaky URI. Jestli je jeÅ¡tÄ› nÄ›kdo použÃvá (bez zakódovánÃ), tak si koleduje o problém. Jestli si dobÅ™e pamatuji, tak jsou stejnÄ› ilegálnÃ. TÃm bych vyÅ™eÅ¡il prvnà problém – HTML odkaz. (AlternativnÄ› bys mohl stÅ™Ãhat takovéto odkazy pÅ™ed znaky „">“, ale to také nenà dokonale systémové Å™eÅ¡enÃ.)
Ostatnà linky jsou bohužel neÅ™eÅ¡itelné, protože ‚[‘ a ‚]‘ jsou znaky použÃvané (tÅ™eba v session ID) a proto je nemůžeme vylouÄit. Na to by byla potÅ™eba dodateÄné logiky.
V mém zápisnÃku rozeznám odkaz, který je ve tvaru Å™etÄ›zec.Å™etÄ›zec pokud nenà pÅ™ÃliÅ¡ krátký a pokud nemá dvÄ› teÄky pÅ™ed lomÃtkem. Také ne nejšťastnÄ›jšà řeÅ¡enà a vyžaduje dodateÄné zpracovánÃ, ale funguje to hezky.
No a nakonec, pro prvotnà vyhledánà linky použÃvám tohoto regexu (v ASP.NET formátu):
\(?(((file|http|https|mailto|gopher|ftp|net\.pipe|net\.tcp|news|nntp):(//)?(www.)?)|www.|//)?(([\w-_+@])+\.)+\w+(:\d+)?([/\\]([\w-_+.:,;=&#/%!?~/\\\<\>\[\]\(\)@])*)?
Pro zjednoduÅ¡enÃ:
prefixes = @"(((file|http|https|mailto|gopher|ftp|net\.pipe|net\.tcp|news|nntp):(//)?(www.)?)|www.|//)";
strictCollection = @"([\w-_+@])"; // pre-slash portions
topLevel = @"\w";
looseCollection = @"([\w-_+.:,;=&#/%!?~/\\\<\>\[\]\(\)@])"; // post-slash portions
pattern = @"\(?" + prefixes + @"?(" + strictCollection + @"+\.)+" + topLevel + @"+(:\d+)?([/\\]" + looseCollection + @"*)?";
Jsem si jist, že by se tento pattern dal hodnÄ› vylepÅ¡it. Je sice celkem benevolentnÃ, ale zatÃm plnà svůj úÄel. Budu proto vÅ™ele oÄekávat každou pÅ™ipomÃnku.
Na testovánà regexů jsem si vytvoÅ™il tool http://www.chacaturian.com/cruncher pracujÃcà opÄ›t na ASP.NET enginu, jestli to nÄ›komu pomůže.
Přeji hodně zdaru,
Ruben
zuTEJZ <a href="http://rgekjsqdushd.com/">rgekjsqdushd</a>, [url=http://jylnifklcdqu.com/]jylnifklcdqu[/url], [link=http://yulpncfczwfa.com/]yulpncfczwfa[/link], http://ttsegllkdryq.com/