Autor Zpráva
Neználek
Profil *
Zdravím, byl jsem donucen přesunout web na PHP 7.3, celé jsem to musel překopat aby to fungovalo tak jako před tím na php 5.x ale je tu věc s kterou neumím hnout, používal jsem následující kód, který v textu hledal odkazy a dělal z nich klikatelné odkazy

preg_replace('~(+([\.-][\w]+)*\.\w{2,4}(?:/]https://|http://|ftp://|(www.))([\w]+([\.-][\w]+)*\.\w{2,4}(?:/ |\b)(?:[^,. ][^\s]*[^,. \n])?)|(\S{61,})~e','(mb_strlen("\5") >= 61 ?"<span title=\"\5\">".(mb_substr("\5", 0, 60))."...</span>" : "<a href=\"".("\1"=="www."?"http://":"\1")."\2\3\" target=\"_blank\" rel=\"nofollow noopener\">".((mb_strlen("\1\3")>=61)?(mb_substr("\1\3",0,60)."..."):"\1\3")."</a>")',$text)

dá se to nějak překopat na PHP 7.3 nebo to celý zahodit? Hledal jsem na webu nějaká hotová řešení ale nic kloudnýho jsem nenašel


tak ještě jednou, ono to ten kod nějak rozbilo

preg_replace('~(https://|http://|ftp://|(www.))([\w]+([\.-][\w]+)*\.\w{2,4}(?:/ |\b)(?:[^,. ][^\s]*[^,. \n])?)|(\S{61,})~e','(mb_strlen("\5") >= 61 ?"<span title=\"\5\">".(mb_substr("\5", 0, 60))."...</span>" : "<a href=\"".("\1"=="www."?"http://":"\1")."\2\3\" target=\"_blank\" rel=\"nofollow noopener\">".((mb_strlen("\1\3")>=61)?(mb_substr("\1\3",0,60)."..."):"\1\3")."</a>")',$text)
Firibix
Profil
Reakce na Neználka:
Použij funkci preg_replace_callback().
Neználek
Profil *
Firibix:
to jsem zkusil a sice už to nehází chybu PHP, pouze varování, ale pro změnu to nepřevede ty odkazy...

Warning: preg_replace_callback(): Requires argument 2, '(mb_strlen("\5") >= 61 ?"<span title=\"\5\">".(mb_substr("\5", 0, 60))."...</span>" : "<a href=\"".("\1"=="www."?"http://":"\1")."\2\3\" target=\"_blank\" rel=\"nofollow noopener\">".((mb_strlen("\1\3")>=61)?(mb_substr("\1\3",0,60)."..."):"\1\3")."</a>")', to be a valid callback in....
Firibix
Profil
Reakce na Neználka:
Přesně jak se píše ve warningu, preg_replace_callback() očekává callback, tedy třeba nějakou anonymní funkci:

$text = preg_replace_callback('~(https://|http://|ftp://|(www.))([\w]+([\.-][\w]+)*\.\w{2,4}(?:/ |\b)(?:[^,. ][^\s]*[^,. \n])?)|(\S{61,})~', function ($matches) {
    if (mb_strlen($matches[5] >= 61) {
        return "<span title=\"".$matches[5]."\">".(mb_substr($matches[5], 0, 60))."...</span>";
    } else {
        return "<a href=\"".($matches[1]=="www."?"http://":$matches[1]).$matches[2].$matches[3]." target=\"_blank\" rel=\"nofollow noopener\">".((mb_strlen($matches[1].$matches[3])>=61)?(mb_substr($matches[1].$matches[3],0,60)."..."):$matches[1].$matches[3])."</a>";
    }
}, $text);

Kód jsem netestoval; určitě by bylo na místě jej trochu přeformátovat pro lepší přehlednost a doplnit escapování regulární výraz vypadá, že žádné potenciálně škodlivé znaky nepropustí, tak by to snad ani nemuselo být nutné.
Neználek
Profil *
Super funguje, díky moc. To bych sám nedal dohromady. Byly tam akorát dvě chybky tak to sem dávám odzkoušené, kdyby to někdo chtěl využít:

$text = preg_replace_callback('~(https://|http://|ftp://|(www.))([\w]+([\.-][\w]+)*\.\w{2,4}(?:/ |\b)(?:[^,. ][^\s]*[^,. \n])?)|(\S{61,})~', function ($matches) {
    if (mb_strlen($matches[5]) >= 61) {
        return "<span title=\"".$matches[5]."\">".(mb_substr($matches[5], 0, 60))."...</span>";
    } 
    else {
        return "<a href=\"".($matches[1]=="www."?"http://":$matches[1]).$matches[2].$matches[3]."\" target=\"_blank\" rel=\"nofollow noopener\">".((mb_strlen($matches[1].$matches[3])>=61)?(mb_substr($matches[1].$matches[3],0,60)."..."):$matches[1].$matches[3])."</a>";
    }
}, $text);

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