Autor | Zpráva | ||
---|---|---|---|
Edhel Profil |
#1 · Zasláno: 27. 3. 2014, 13:24:23
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); |
||
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)); |
||
Tori Profil |
#4 · Zasláno: 27. 3. 2014, 22:18:27
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); } |
||
Edhel Profil |
#5 · Zasláno: 28. 3. 2014, 12:44:14
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:) |
||
Časová prodleva: 11 let
|
0