Wojciech Kaźmierczak

Wojciech Kaźmierczak Developer PHP, IOKI
Sp.z o. o. Sp. K.

Temat: data w tablicy na podstawie $replacement z preg_replace

Powiedzmy, że mam jakiś szablon.
Użytkownik w zależności od wybranego obiektu może go wypełnić tagami
(sam szablon wypełnia się później):
%nazwa_kolumny% lub %+1% - co oznacza + 1 godzina od teraz
(timestamp).

mamy więc:
$body_tags = array(
'/\%kolumna1\%/',
'/\%kolumna2\%/',
'/\%+(\d+)\%/');

i zamienniki (w oparciu o obiekt lub datę):

$body_elements = array(
$this->getColumn1(),
$this->getColumn2(),
'date("Y-m-d H:i:s", time() + ($1 * 60 * 60))'
);
$body = preg_replace($body_tags, $body_elements, $template);

czy jest jakiś sposób aby podstawić za +1 datę generowaną na podstawie
zwróconej wartości jako $match[1] = 1?

próbowałem preg_replace_callback i taka podmiana działa ale wtedy
tracę możliwość manipulowania obiektem.

Dzięki za pomoc
Pozdrawiam
WojciechK

konto usunięte

Temat: data w tablicy na podstawie $replacement z preg_replace

Wojciech Kaźmierczak:

próbowałem preg_replace_callback i taka podmiana działa ale wtedy tracę możliwość manipulowania obiektem.

Jakim obiektem? I czemu tracisz?

konto usunięte

Temat: data w tablicy na podstawie $replacement z preg_replace

Dobra, nie mam czasu czekać, aż napiszesz, że w callbacku nie masz dostępu do $this.


class A
{
function callback(){}
function getColumn1(){}
function parse(){
return preg_replace_callback($pattern, array($this, 'callback'), $subject);
}
}
Wojciech Kaźmierczak

Wojciech Kaźmierczak Developer PHP, IOKI
Sp.z o. o. Sp. K.

Temat: data w tablicy na podstawie $replacement z preg_replace

Łukasz K.:
Dobra, nie mam czasu czekać, aż napiszesz, że w callbacku nie masz dostępu do $this.
dokładnie - chodziło o $this, po 2 godzinach siatkówki też tylko takie rozwiązanie mi wpadło.

Dzięki
Bartosz Turkot

Bartosz Turkot Graphics Software
Engineer, Intel
Technology Poland

Temat: data w tablicy na podstawie $replacement z preg_replace

W wersji 5.3 mamy też nasz ulubione z JS closures i anonimowe funkcje.
preg_replace_callback($pattern, function(){});

$this też w takim przypadku zadziała (nie sprawdzałem).Bartosz Turkot edytował(a) ten post dnia 16.12.11 o godzinie 12:09

konto usunięte

Temat: data w tablicy na podstawie $replacement z preg_replace

Bartosz Turkot:
W wersji 5.3 mamy też nasz ulubione z JS closures i anonimowe funkcje.
preg_replace_callback($pattern, function(){});

$this też w takim przypadku zadziała (nie sprawdzałem).

Nie gadaj bzdur.
W closures nie można odwoływać się bezpośrednio do $this.

konto usunięte

Temat: data w tablicy na podstawie $replacement z preg_replace

Chyba tylko tak:


<?php

class AA
{
public $a = 1;

private $b = 2;

function foo()
{
$dhis = $this;
$c = function()use($dhis){ echo $dhis->a; };
$c();
# $d = function()use($dhis){ echo $dhis->b; }; // wont work
# $d();
}
};

$x = new AA();

$x->foo();



Ale to bez sensu.
Wojciech Kaźmierczak

Wojciech Kaźmierczak Developer PHP, IOKI
Sp.z o. o. Sp. K.

Temat: data w tablicy na podstawie $replacement z preg_replace

Łukasz K.:

class A
{
function callback(){}
function getColumn1(){}
function parse(){
return preg_replace_callback($pattern, array($this, 'callback'), $subject);
}
}
zakończyło się na rozwiązaniu zaproponowanym przez Łukasza, nie zmienia to jednak faktu, że statycznie callback'a nie wywołamy:


return preg_replace_callback($pattern, array($values, 'callback'), $subject);

function callback($groups) {
if($groups[1] && $groups[2]) {
if($groups[1]=='-') {
return date("Y-m-d H:i:s", time() - ($groups[2] * 60 * 60));
} else {
return date("Y-m-d H:i:s", time() + ($groups[2] * 60 * 60));
}
} else {
return $values->getValue();
}
}
Wojciech Kaźmierczak edytował(a) ten post dnia 17.12.11 o godzinie 11:54

konto usunięte

Temat: data w tablicy na podstawie $replacement z preg_replace

Wojciech Kaźmierczak:

return preg_replace_callback($pattern, array($values, 'callback'), $subject);

To herezja jest.

Callback w PHP możesz przekazać na kilka sposobów, m.in.:

- 'nazwafunkcji'
- array( $obiekt, 'nazwa_metody_obiektu' );
- array( 'Nazwa_Klasy', 'nazwa_statycznej_metody_obiektu' );

Dostępność zmiennych regulują standardowe zasady ich widoczności. Jak więc widać, Twój przykład to próba wywołania metody callback() na obiekcie wskazywanym przez $values, co udać się nie mogło.

Od PHP 5.3 możemy też zastosować funkcje anonimowe (poczytaj o tym). Możesz więc rozważyć:


preg_replace_callback($pattern, function($o)use($values){
// tu masz dostępną tablicę $values, ale nie $this
}, $subject);
Łukasz K. edytował(a) ten post dnia 17.12.11 o godzinie 12:20
Wojciech Kaźmierczak

Wojciech Kaźmierczak Developer PHP, IOKI
Sp.z o. o. Sp. K.

Temat: data w tablicy na podstawie $replacement z preg_replace

Łukasz K.:

- array( $obiekt, 'nazwa_metody_obiektu' );
czyli tak (przetestowane na http://freephptest.com):

<?php
class KeywordContainer {
public $hash;

function KeywordContainer($hash) {
$this->hash = $hash;
}

function PCRESubstitute($m) {
$key = strtolower(preg_replace('/\{(.*?)\}/im', '$1', $m[0]));
if(array_key_exists($key, $this->hash)) {
return $this->hash[$key];
} else {
if($m[1] && $m[2]) {
return date("Y:m:d H:i:s", time() + ($m[2] * 60 * 60));
} else {
return $m[0];
}
}
}

}

$user = array('user' => "morgan",
'name' => "Morgan Seppy",
'expires' => "2006-08-28" );

$closure = array(new KeywordContainer($user), 'PCRESubstitute');

$body_tags = array(
'/\{NAME\}/',
'/\{USER\}/',
'/\{(\+)(\d+)\}/',
);

$template = "Hello, {NAME}! {+1} expires on {EXPIRES}";
echo preg_replace_callback($body_tags, $closure, $template);
?>

konto usunięte

Temat: data w tablicy na podstawie $replacement z preg_replace

Wojciech Kaźmierczak:
Łukasz K.:

- array( $obiekt, 'nazwa_metody_obiektu' );
czyli tak (przetestowane na http://freephptest.com):

<?php[/quote]> class KeywordContainer {[quote]...
?>

Mniej więcej. Tylko nie nazywałbym tego domknięciem, a konstruktor tworzył przez zdefiniowanie metody __construct() a nie KeywordContainer(). No i pamiętabym o wcięciach! Ale jeśli chodzi o przykład samego callbacku, to jest ok.Łukasz K. edytował(a) ten post dnia 19.12.11 o godzinie 12:04
Bartosz Turkot

Bartosz Turkot Graphics Software
Engineer, Intel
Technology Poland

Temat: data w tablicy na podstawie $replacement z preg_replace

Michał Wachowski:
Bartosz Turkot:
W wersji 5.3 mamy też nasz ulubione z JS closures i anonimowe funkcje.
preg_replace_callback($pattern, function(){});

$this też w takim przypadku zadziała (nie sprawdzałem).

Nie gadaj bzdur.
W closures nie można odwoływać się bezpośrednio do $this.

Jak wyraźnie zaznaczyłem, nie sprawdzałem. Niemniej wynika to z tego, że zrezygnowali ze wsparcia dla $this w clojures w przypadku 5.3. Na temat 5.4 jest o tym całkiem interesująca dyskusja, dla zainteresowanych polecam:
https://wiki.php.net/rfc/closures/object-extension

Następna dyskusja:

php 5.4 i preg_replace_cal...




Wyślij zaproszenie do