Autor | Zpráva | ||
---|---|---|---|
Harkonnen Profil * |
#1 · Zasláno: 16. 7. 2007, 20:41:16
Zdravím lidi. Mám problém ohledně knihy návštěv. Mám kód, který v textu pozná odkazy typu http://... www... a převede je na <a href="...">...</a>. Tak to by fungovalo, ale některé, zvláště dlouhé odkazy (hlavně 90 a více znaků) nejsou rozpoznány jako odkaz. Regulárním výrazům moc nerozumím, tak se můžete podívat na ten můj, je to stažené myslím z phpBB. Chtěl bych, aby se dlouhé odkazy zkrátily, jakmile budou mít třeba 100 znaků, tak aby to bylo typu <a href="cely odkaz">zkraceny odkaz...</a>, ale nevím, jak to mám do toho svého regexp výrazu zakomponovat. Může někdo poradit?
function make_clickable($text) |
||
Harkonnen Profil * |
#2 · Zasláno: 16. 7. 2007, 21:49:18
Teď se dívám, že to při vkládání sem zrušilo některé lomítka, tak to teď snad už bude dobře:
function make_clickable($text) { $text = preg_replace('#(script|about|applet|activex|chrome):#is', "\1:", $text); $ret = ' ' . $text; $ret = preg_replace("#(^|[ ])([w]+?://[w#$%&~/.-;:=,?@[]+]*)#is", "\1<a href="\2" target="_blank">\2</a>", $ret); $ret = preg_replace("#(^|[ ])((www|ftp).[w#$%&~/.-;:=,?@[]+]*)#is", "\1<a href="http://\2" target="_blank">\2</a>", $ret); $ret = preg_replace("#(^|[ ])([a-z0-9&-_.]+?)@([w-]+.([w-.]+.)*[w]+)#i", "\1<a href="mailto:\2@\3">\2@\3</a>", $ret); $ret = substr($ret, 1); return($ret); } $popis = make_clickable($popis); |
||
Harkonnen Profil * |
Hmm omlouvám se, ale nevím, jak se to tady vkládá, takže jsem to uložil do souboru. Tady to vždycky odstraní nějaké lomítka. Ta funkce je ZDE.
|
||
Harkonnen Profil |
#4 · Zasláno: 17. 7. 2007, 16:54:32
|
||
zdeněk Profil * |
#5 · Zasláno: 17. 7. 2007, 22:29:58
Asi před rokem jsem dal do této diskuse kód, který používám ve své knize návštěv http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=9&topic=33 515
možná by mohl přinést trochu inspirace. |
||
Harkonnen Profil |
#6 · Zasláno: 17. 7. 2007, 23:50:23
Díky za inspiraci, ale dělá mi to problémy. Zkrátí to jen dlouhé odkazy a u těch krátkých to buď neudělá nic, nebo jen zformátuje bez převodu. Záleží taky, kde dám mezeru a kde odentruju... :-( Chtělo by to něco jistého a funkčního v každé situaci. Ale i tak díky za snahu.
|
||
zdeněk Profil * |
#7 · Zasláno: 18. 7. 2007, 10:09:52
Ten kód ale má za úkol krátit a převést jen odkazy delší než 40 znaků a krátké pouze převést na http://... Mezeru nebo odentrování by odkaz obsahovat neměl.
|
||
TFSi Profil |
#8 · Zasláno: 18. 7. 2007, 10:37:02
Harkonnen
Zrovna jsem hledal něco na tenhle způsob. Vyřešil jsem to takhle: function prevod_odkazu($text, $pocet){ Není to sice zrovna ideální řešení, ale mě funguje a muí to http:// https:// ftp:// ... ;) |
||
Harkonnen Profil |
#9 · Zasláno: 18. 7. 2007, 11:04:36
zdeněk
Ano, ja to nemyslel tak, že odkaz bude obsahovat mezeru nebo , ale mi to reaguje na to, jestli je pred nebo za samotnym odkazem mezera nebo . Pak mi to dela ruzne problemy. TFSi Tak takové velice podobné řešení jsem tu už měl. Je sice kvalitní a funguje, ale jak už jsem psal někde výš, převádí jen odkazy začínající ://, tedy http:// atd. Ale lidé určitě budou psát i jen s www, takže bych to tam chtěl mít taky. A zatím nevím jak. Ještě se pokusím to dát nějak do kupy s tím řešením od phpBB. |
||
Harkonnen Profil |
#10 · Zasláno: 18. 7. 2007, 11:50:50
Nemůžete někdo zkusit dát dohromady to moje řešení, co mám nahoře s tím od Zdeňka? Tedy aby tam byly ty moje funkce, ale zároveň použít to zkracování, jako strlen(...)?substr(...)... Mi se to nějak nedaří.
|
||
TFSi Profil |
#11 · Zasláno: 18. 7. 2007, 12:54:47
tak to mě potom napadá, že než se "srát" s reguláry, tak jednoduše nahradit www. za http://www. a teprve potom použít převod na odkaz?
|
||
Harkonnen Profil |
#12 · Zasláno: 18. 7. 2007, 15:30:53
Hehe. :-) Tak přesně to jsem nakonec udělal a funguje mi to výborně. Převádí a zkracuje to všechno. Teď je ale díky tomu nový problém. Co mám pak dělat s funkcí wordwrap, když ji mám nastavenou na dělení slov po 80, zkracování odkazů na 60, ale přece jenom v a href zůstane "slovo" delší než je 80 znaků, protože délku odkazu nijak neomezuju. Tak jak to vyřešit, aby wordwrap tohle nedělil ale ostatní slova jo?
|
||
Harkonnen Profil |
#13 · Zasláno: 18. 7. 2007, 16:05:20
Tak jsem to tak nechal, použil jsem wordwrap a potom jsem to chtěl udělat tak, že bych našel místo, kde je a href a v něm když bude mezera (způsobená wordwrapem), tak se smaže (opraví) nějakým regulárním výrazem. Vymyslel jsem tento:
$popis = preg_replace('^href=.+|[:space:]|.+"$', '\1\3', $popis); Ale vůbec jim nerozumím, tak mě nekamenujte za totální blbost, protože to samozřejmě nefunguje. Nevíte někdo, jak to udělat? |
||
TFSi Profil |
#14 · Zasláno: 18. 7. 2007, 18:02:15
Použij Texy! =)
|
||
Harkonnen Profil |
#15 · Zasláno: 18. 7. 2007, 18:23:35
A to je co? :-)
|
||
TFSi Profil |
#16 · Zasláno: 19. 7. 2007, 09:59:53
A to je co? :-)
http://Texy.info/ a odpadnou ti problémy se zkracováním odkazů :) |
||
krteczek Profil |
#17 · Zasláno: 19. 7. 2007, 12:22:09
TFSi: nebo ještě lépe:
Texyla což je ajax nadstavby na Texy |
||
Harkonnen Profil |
#18 · Zasláno: 19. 7. 2007, 15:50:30
Aaaaa tak už jsem to konečně vyřešil pomocí jiného řešení. Funguje úplně všechno, nic nedělá problémy, je to super. :-)
|
||
TFSi Profil |
#19 · Zasláno: 19. 7. 2007, 16:24:51
Harkonnen
Tak se s námi o to "jiné řešení" poděl, ať máme inspiraci pro další generace ;) |
||
Harkonnen Profil |
#20 · Zasláno: 19. 7. 2007, 17:11:17 · Upravil/a: Harkonnen
OK. :-)
function odkazy($text){ $words = Split("[[:blank:]]+", $text); $connect_text = ''; while(Current($words)) { $word = Current($words); if(EregI("https?://[^ ]+.[^< ]+", $word, $part)) { $word = Str_Replace($part[0], '<a target="_blank" href="' . $part[0] . '">' . ((strlen($part[0])>60)?(substr($part[0],0,60).'...'):$part[0]) . '</a>', $word);} elseif(EregI("ftps?://[^ ]+.[^< ]+", $word, $part)) { $word = Str_Replace($part[0], '<a target="_blank" href="' . $part[0] . '">' . ((strlen($part[0])>60)?(substr($part[0],0,60).'...'):$part[0]) . '</a>', $word); } elseif(EregI('www.[^ ]+.[^< ]+', $word, $part)) { $word = Str_Replace($part[0], '<a target="_blank" href="http://' . $part[0] . '">' . ((strlen($part[0])>60)?(substr($part[0],0,60).'...'):$part[0]) . '</a>', $word); } else { $word = Wordwrap($word, 80, " ", 1); } $connect_text .= $word . " "; Next($words); } return $connect_text; } $popis = odkazy($popis); Tak takhle to teď vypadá. Jde o to, že když je nalezena adresa delší než 60 znaků, uloží se do href celá, ale navenek je jen 60 znaků plus "...", takže pak je nastavené dělení ostatních slov na 80 a adres se to vůbec nedotkne. To je přesně to, co jsem hledal. No, po pár dnech práce to konečně mám. :) Kdyby se to tady náhodou zobrazilo špatně, tak je ta funkce uložena ZDE. Enjoy ;) |
||
Časová prodleva: 17 let
|
0