Autor Zpráva
Harkonnen
Profil *
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)

{
$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 *
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
Nebo nějak do TOHODLE řešení zakomponovat i www a ftp. Zkracovat to umí dobře, ale na odkazy to převádí jen ty, které začínají http:// a já potřebuju i www a ftp. Pomůže někdo prosím?
zdeněk
Profil *
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
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 *
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
Harkonnen
Zrovna jsem hledal něco na tenhle způsob. Vyřešil jsem to takhle:
function prevod_odkazu($text, $pocet){

$nahrad = "([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])";
preg_match_all("!$nahrad!", $text, $adress);

$count=count($adress[0]);

for ($i=0; $i<=$count; $i++){

if(strlen(@$adress[0][$i])>$pocet) {
$odkazik = substr($adress[0][$i], 0, $pocet-3)."...";
}else{
@$odkazik = $adress[0][$i];
}

//zde se urcuje jak bude odkaz vypadat muzes si tam pridat treba: class=odkaz nebo target="_blank"
@$odkaz = '<a href="'.$adress[0][$i].'" title="'.$adress[0][$i].'" >'.$odkazik.'</a>';
@$text = str_replace($adress[0][$i], $odkaz, $text);
}

return $text;
}
$text = prevod_odkazu($text, 60);

Není to sice zrovna ideální řešení, ale mě funguje a muí to http:// https:// ftp:// ... ;)
Harkonnen
Profil
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
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
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
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
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
Použij Texy! =)
Harkonnen
Profil
A to je co? :-)
TFSi
Profil
A to je co? :-)
http://Texy.info/ a odpadnou ti problémy se zkracováním odkazů :)
krteczek
Profil
TFSi: nebo ještě lépe:
Texyla což je ajax nadstavby na Texy
Harkonnen
Profil
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
Harkonnen
Tak se s námi o to "jiné řešení" poděl, ať máme inspiraci pro další generace ;)
Harkonnen
Profil
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 ;)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0