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 |
#2 · Zasláno: 21. 9. 2020, 11:03:26
Reakce na Neználka:
Použij funkci preg_replace_callback() .
|
||
Neználek Profil * |
#3 · Zasláno: 21. 9. 2020, 11:10:24
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 |
||
Neználek Profil * |
#5 · Zasláno: 21. 9. 2020, 11:49:02
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); |
||
Časová prodleva: 4 roky
|
0