Jak v PHP vyměnit všechny URL v textu za aktivní link?

Občas je potřeba uživatelům zatrhnout přidávání aktivních odkazů. Nedávno jsem řešil vkládání odkazů na diskuzním fóru, kde pochopitelně nechci podporovat různé spamerské nápady. Problém je, že uživatel může zadat HTML odkaz v mnoha různých podobách a potom se velice těžko řeší násilné přeformátování odkazu. Pokud obětujeme pěkné anchor texty, dá se podobný problém vyřešit tím, že uživateli povolíte vložit URL jako text a poté ho automaticky převedete na aktivní odkaz. Pomocí dříve uvedené dezinfekční funkce zakážete (resp. nepovolíte) vkládání odkazů v HTML a následně pomocí další funkce všechny odkazy najdete a převedete na aktivní nofollow odkazy.

function replace_links($text)
{
 // přidej http:// ke každému www.
$text = str_replace( ‚www.‘, ‚http://www.‘, $text);
 // smaž vzniklé duplikáty
$text = str_replace( ‚http://http://www.‘, ‚http://www.‘, $text);
$text = str_replace( ‚https://http://www.‘, ‚https://www.‘, $text);
// nastavení regulárního filtru
$find_url = „/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/“;
// najdi všechny url v textu
preg_match_all($find_url, $text, $url);
$i = 0;
// vytvoř ze všech odkazů hyperlink
while ($url[0][$i]):
$text = str_replace($url[0][$i], ‚<a href=“‚.$url[0][$i].‚“ rel=“nofollow“>‘.$url[0][$i].‚</a>‘, $text);
$i++;
endwhile;
return ($text);
}

Počáteční doplnění http:// je sice řešeno hrubou silou, nicméně str_replace je výrazně výkonnější jak složitější vyhledávání pomocí regulárního výrazu a následná výměna pouze odkazů bez http://. Podobné funkce nalezente v mnoha verzích na internetu, podle mých testů však řada uvedených regulárních výrazů nefunguje dobře a navíc jsem nikde neobjevil funkční řešení, které udělá aktivní odkaz ze všech URL v textu. Tato funkce zatím funguje dobře, ale nezkoušel jsem zadávat různé pekelné parametry za koncovkou, u některých možná bude blbnout.

Příspěvek byl publikován v rubrice Nezařazené a jeho autorem je diginomad. Můžete si jeho odkaz uložit mezi své oblíbené záložky nebo ho sdílet s přáteli.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *