Autor Zpráva
user243
Profil
Dobrý den,
mám text, který prohledávám na odkazy a upravuji je do HTML podoby, ale potřeboval bych názvy příliš dlouhých odkazů trochu oříznout; něco jsem sesmolil, ale chová se to trochu divně...
$text = preg_replace("/\[url=(.+?)\](.+?)\[\/url]/s",
                         '<a href="\\1" target="_blank">' . ((strlen('\\2') > 29)?(substr('\\2',0,26).'&hellip;'):'\\2') . '</a>', $text);
počet znaků odpovídá dvěma a substr vlastně nic neořízne, ale když tedy není splněna podmínka, tak se v textu objeví hodnota \\2 místo jen znaků \\2
předem děkuji za pomoc.
Tori
Profil
Tohle nefunguje, protože se nejdřív vyhodnotí podmínka a pak se teprv výsledek použije jako nahrazení.
$text = preg_replace_callback("/\[url=(.+?)\](.+?)\[\/url]/s", function($matches) {
        return '<a href="'.$matches[1].'" target="_blank">' 
            . (strlen($matches[2]) > 29 ? substr($matches[2], 0, 26).'&hellip;' : $matches[2]) 
            . '</a>';
    }, $text);
user243
Profil
To mi nedošlo, děkuji.
Je nějaký speciální rozdíl při použití anonymní funkce vůči obyčejné?
Tori
Profil
Anonymní funkce fungují od PHP 5.3 a nemůže u nich dojít k tomu, že by někde existovala nějaká jiná stejnojmenná fce. Výkonový rozdíl bude asi zanedbatelný. Osobně je u regulárů (a polí) používám hlavně kvůli přehlednosti kódu - jsou na stejném místě jako regulár, takže nemusím při jejich změně překlikávat někam na definici fce.
user243
Profil
Dobře, ještě jednou děkuji.

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