[PHP] Preg_replace replacements doorgeven als string

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer d.m.v. een bbcode-achtig scriptje een replacement door te geven aan een andere functie, die met de doorgegeven variabelen weer gegevens uit een database haalt.

Ter verduidelijking, deze functie haalt m.b.v. een product-ID ($pid) en een productoptie-ID ($oid) een totale prijs ($attr_price['excl']) en BTW-percentage ($attr_price['tax']) op.

PHP:
1
2
3
4
5
6
function bb_attribute ($pid, $oid) {
    global $currencies;
    $attr_price_query = tep_db_query("SELECT (p.products_price + pa.options_values_price) AS excl, tr.tax_rate AS tax FROM products p, products_attributes pa, tax_rates tr WHERE p.products_id = '".$pid."' AND pa.products_id = p.products_id AND options_values_id = '".$oid."' AND tr.tax_class_id = p.products_tax_class_id;");
    $attr_price = tep_db_fetch_array($attr_price_query);
    return $currencies->display_price($attr_price['excl'],$attr_price['tax']);
}


Tot zover werkt alles, wanneer ik handmatig wat getallen in klop. Verderop gaat het echter fout:

PHP:
1
$str = preg_replace("#\(\((.*?):(.*?)\)\)#is", bb_attribute('$1','$2'), $str);


Dit zou dus ((373:107)) moeten vervangen en 373 en 107 als respectievelijk $pid en $oid moeten doorgeven. Makkelijker gezegd dan gedaan. Hier een aantal dingen die ik heb geprobeerd door de return in bb_attribute te vervangen, met de uitwerking die ze hadden:

PHP:
1
2
3
4
5
6
7
return $pid; // 373
return gettype($pid) // string
return (int)$pid; // 0
return intval($pid) // 0
return $pid * 1; // 0
return $pid[0]; // $
return $pid[1]; // 1


Kortom: '$1' komt ook door als string '$1', maar toch ook als '373'. :S Wat zie ik over het hoofd?

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 21:12
Nu wordt bb_attribute('$1','$2') uitgevoerd en het resultaat daarvan wordt het tweede argument van preg_replace(). Wat jij wilt, is dat die bb-functie pas wordt uitgevoerd als preg_replace bezig is. Dat kan met de e-modifier of preg_replace_callback().

Ter aanvulling: dat je wel 373 te zien krijgt als je "return $pid;" gebruikt, is omdat het tweede argument van preg_replace() dan het eerste argument van bb_attribute() wordt, dus '$1'. Tijdens het replacen wordt dat vervangen door de match 373. In de andere gevallen maak je een getal van de string '$1' en dat wordt 0, of (laatste twee) pak je een van de twee karakters.

[ Voor 31% gewijzigd door Raynman op 26-01-2009 15:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Perfect! Bedankt!