Autor Zpráva
Edhel
Profil
Ahojte, potřeboval bych poradit jestli je možné nějak přepsat funkci preg_replace na preg_replace_callback tak, aby pořád mohla pracovat s poli. Situace je takováto:
Mám metodu, která si z databáze vytáhne obsah stránky (do $vypln) a "přeloží" tagy pro obrázky, zvuky... (aby při vkládání do databáze mohly být co nejjednodušší a při zobrazení přitom vypadaly pěkně... úryvek kódu vypadá takto
<?php
$replace = array();
  $replace['picture'] = '/<img src="(.*)" alt="(.*)">/siU';
  $replace['sound'] = '/<sound src="(.*).mp3">/siU';
  $replace['video'] = '/<video src="(.*)">/siU';
  ....
  
$fill = array();
  $fill['picture'] = '<figure class="picture"><figcaption>$2</figcaption><a href="'.$this->base.'obr/$1" target="_blank"><img src="'.$this->base.'obr/s_$1" alt="$2"></a></figure>';
  ...
  
  return preg_replace($replace, $fill, $vypln);
?>

Jako další krok jsem napsal metodu, která vezme "jednoduchou" adresu z odkazu a vytáhne si z databáze skutečnou url podle aktuálního jazyka, kterou vyplivne (takže např z <a href="webovky/1/2/3">odkaz</a> udělá <a href="webovky.cz/kurzy/programovani/jak_zvladat_preg_replace">odkaz</a>). Ta funguje v jiných částech (např v jednom vedlejším menu), ale abych ji procpal do zmíněné metody na překládání obsahu stránky, pochopil jsem, že bych musel použít preg_replace_callback, protože preg_replace nedokáže poslat získaný regulérní výraz v proměnné jiné metodě... nevím, jestli používám správně terminologii, prostě (mi) nejde nacpat to \1 do self::decodeURL($lang, \1), které by mělo být někde ve $fill['address'] = ... .
Se samostatnou funkcí preg_replace_callback bych si asi poradil, ale je možné ji nějak použít, aby stále bylo možné pracovat s poli pro obrázky, zvuky a další, které jsem si vytvořil pro preg_replace? Zatím se mi zdálo, že je možné ji použít jen na jeden výraz.
peta
Profil
Viz dokumentace, priklady, mozna i ty v komentu od Richarda, Yuri a tijn at q-go dot com .
http://www.php.net/manual/en/function.preg-replace-callback.php
\1 $1 - to je $matches[1]
return preg_replace_callback($replace,  'funkce', $vypln);
Ve funkci pak muzes $matches[1] nechat dohledat url. A pak to jen poskladas dohromady, treba opet reg. vyrazem, kde misto $1, $2,... pouzijes $matches[1],....
Edhel
Profil
peta:
Díky za odpověď, ale moc mi to nepomohlo. Do dokumentace jsem samozřejmě koukal, než jsem sem psal, ale řešení jsem tam nenašel.
Tohle má dvě mouchy: 1) potřebuju zaráz při zavolání té funkce předat proměnnou $lang (aby překlad adresy věděl, jaký jazyk má použít)
2) Sice to přeloží tu adresu podle mnou dříve vymyšlené funkce, ale nevidím, jak tomu zachovat i schopnost "překládat" obrázky a ostatní prvky, které mám v těch polích. V žádném z těch příkladů nikdo nic podobného s preg_replace_callback nedělá... nebo k tomu používá výrazy, ze kterých nechápu, že to dělá... (asi bych měl zmínit, že nejsem zrovna machr na php, ty složitější funkce mi pořád unikají).
Hádám, že by bylo možné udělat něco jako
return preg_replace_callback($vzorecAdresy, array($this, 'funkce'), (preg_replace($replace, $fill, $vypln));
ale pořád bych tam potřeboval procpat tu proměnnou pro jazyk. (Jo, možná jsem měl zmínit, že to má být objektově.)
Tori
Profil

public function foo()
{
    // ...
    $that = $this; // do anonymní funkce se $this dá zkopírovat až od PHP 5.4
    return preg_replace_callback($vzorecAdresy, function($matches) use ($that, $replace, $fill, $lang) {
        $return = preg_replace($replace, $fill, $matches[0]);
        $return = $that->jinaMetoda($return, $lang);
        return $return;
    }, $vypln);
}
- něco takového? Případně i v té vnořené funkci může být replace_callback s jinou anonymní fcí. Asi to nebude extra rychlé, ale použitelné by to bylo.
Edhel
Profil
Tori: Ahoj, tohle už skoro vypadá, že bych tomu mohl rozumět:) Zkusil jsem to, ale háže mi to hlášku "unexpected tfunction..." (nebo tak něco). Možná je to tím, že na localhostu mám trošku zastaralejší php (5.2. myslím).
Nicméně jsem zkusil to preg_replace_callback(.... preg_replace(...)), nastavil jazyk jako atribut třídy a u všech funkcí přepsal, kde mají tuhle proměnnou hledat a vypadá to, že to funguje. Děkuju za čas vás obou. I když jsem sice vaše řešení nepoužil, pomohlo mi to se podívat správným směrem:)

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: