[PHP] tekst vervangen door outputfunctie + random getal

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Ik zit met het volgende probleem
ik heb een formulier in html: form.html

nu heb ik hierin een hoop datum lists nodig (layout: 2, maart, 2011) en die zijn gemaakt met selects.
aangezien ik in mijn form 13 van deze datum lijsten nodig heb heb ik hiervoor een php functie geschreven: dateListDayMonthYear($uniqueId="0");

Deze returned dus bv:

HTML:
1
2
       <select id="datum.$uniqueId"><option value='1'>1</option>
...


Werkt allemaal perfect echter gaat het mis wanneer ik mijn functie wil gebruiken op de volgende manier:

Ik heb in mijn form ipv 13 keer alles te schrijven dus nu {dateListDayMonthYear} gezet met de bedoeling deze allemaal te vervangen op de volgende manier:

PHP:
1
2
    $template = file_get_contents("form.html");
    echo str_replace('{dateListDayMonthYear}', $form->dateListDayMonthYear($count),$template,$count);


Dit werkt half, het probleem zit hem in die uniqueId die ik vereis met mijn functie (omdat ik anders nl niet de gegevens van mijn formulier correct kan verwerken)

Ik had het dus op deze creatieve manier proberen op te lossen door $count als uniek getal elke keer te gebruiken, echter werkt dit niet.

De oplossing is eigenlijk om woord per woord de {dateListDayMonthYear} te gaan vervangen door mijn functie en dan een unieke id meegeven adhv de hoeveelste keer ik dit vervang.
Echter vind ik hier geen php functie voor, of een methode...

Iemand die me op weg kan helpen? of een ander idee heeft?
zelf 13 x de functie schrijven in form.php kan ook maar dan heb ik mijn php/html niet meer gescheiden, het moet zo ook kunnen :+

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

In str_replace zit - voor zover ik weet - niet iets van een herhalend element. Je functie wordt dus waarschijnlijk maar één keer aangeroepen.

Wat mij betreft zou het volgende moeten lukken:

Je gebruikt een functie als preg_replace, waarmee je kan aangeven dat er steeds maar één element moet worden vervangen. Je kan dan iets doen als
PHP:
1
2
3
4
5
for ( $i = 0; $i <= 13; $i++ ) {
  $cnt = 0;
  $template = preg_replace($regexp, $form->dateListDayMonthYear($i), $template, 1, $count);
  if ( $count === 0 ) break;
}


Zie voor meer info over preg_replace ook de php manual.

[ Voor 3% gewijzigd door gvanh op 18-12-2007 14:00 . Reden: Aanvulling code. ]


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
gvanh schreef op dinsdag 18 december 2007 @ 13:57:
In str_replace zit - voor zover ik weet - niet iets van een herhalend element. Je functie wordt dus waarschijnlijk maar één keer aangeroepen.

Wat mij betreft zou het volgende moeten lukken:

Je gebruikt een functie als preg_replace, waarmee je kan aangeven dat er steeds maar één element moet worden vervangen. Je kan dan iets doen als
PHP:
1
2
3
4
5
for ( $i = 0; $i <= 13; $i++ ) {
  $cnt = 0;
  $template = preg_replace($regexp, $form->dateListDayMonthYear($i), $template, 1, $count);
  if ( $count === 0 ) break;
}


Zie voor meer info over preg_replace ook de php manual.
Het nadeel is natuurlijk wel dat ik nu weet dat ik er 13 heb, stel dat ik het modulair wil en niet weet hoeveel ik er heb, hoe kan ik dit dan "tellen", bedankt alvast voor de nuttige reactie

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Met een while loop en controleren wat preg_replace terug geeft?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Of je gebruikt preg_replace_callback en een tellertje in je form class. Desnoods met een static in de method zelf.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
T-MOB schreef op dinsdag 18 december 2007 @ 15:01:
Of je gebruikt preg_replace_callback en een tellertje in je form class. Desnoods met een static in de method zelf.
ik heb dit al doorgenomen maar zou je het iets kunnnen verduidelijken?
Hoe je die preg_replace_callback dan kunt gebruiken om een tellertje te maken, want dat is wel wat ik zoek vermoed ik :)

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

Verwijderd

Sjoerd schreef op dinsdag 18 december 2007 @ 14:50:
[...]

Het nadeel is natuurlijk wel dat ik nu weet dat ik er 13 heb, stel dat ik het modulair wil en niet weet hoeveel ik er heb, hoe kan ik dit dan "tellen", bedankt alvast voor de nuttige reactie
Ik zou er dan dit van maken (niet getest):
PHP:
1
2
3
4
5
6
7
8
<?php
$count = 1;
$cnt = 0;
while( $count !== 0 ){
  $template = preg_replace($regexp, $form->dateListDayMonthYear($cnt), $template, 1, $count);
  $cnt++;
}
?>

Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Verwijderd schreef op dinsdag 18 december 2007 @ 15:21:
[...]

Ik zou er dan dit van maken (niet getest):
PHP:
1
2
3
4
5
6
7
8
<?php
$count = 1;
$cnt = 0;
while( $count !== 0 ){
  $template = preg_replace($regexp, $form->dateListDayMonthYear($cnt), $template, 1, $count);
  $cnt++;
}
?>
Ik zeg het normaal alleen tegen men vriendin maar ik hou van je :D _/-\o_
heel erg bedankt, doet precies wat ik zocht!

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • DanielG
  • Registratie: Oktober 2005
  • Laatst online: 08-09 15:36

DanielG

i = 0x5f3759df - (i>>1); ☠₧ℳ🀪❣

hier stond onzin

[ Voor 102% gewijzigd door DanielG op 18-12-2007 15:34 . Reden: Niet gekeken naar de preg_replace ]

http://xyproblem.info/


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Een preg_replace_callback zal hier toch echt een stuk sneller zijn, dan hoeft die namelijk niet n keer een regex uit te voeren.

PHP:
1
2
3
4
5
6
7
$count = 0;
function replaceDateList() {
  global $count, $form;
  $form->dateListDayMonthYear($count++)
}

$template = preg_replace_callback($repexp, "replaceDateList", $template);


Je zou het in een klasse kunnen stoppen om die vieze globals te vermijden

[ Voor 35% gewijzigd door robbert op 18-12-2007 15:56 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Sjoerd schreef op dinsdag 18 december 2007 @ 15:11:
[...]

ik heb dit al doorgenomen maar zou je het iets kunnnen verduidelijken?
Hoe je die preg_replace_callback dan kunt gebruiken om een tellertje te maken, want dat is wel wat ik zoek vermoed ik :)
Voor dat tellertje kun je gebruik maken van een statische variabele:
PHP:
1
2
3
4
function getId() {
    static $id = 1; //initial value
    return $id++;
}

Elke keer dat getId() wordt aangeroepen wordt de huidige tellerstatus teruggeven, en de teller opgehoogd. Op dezelfde manier kun je $count in je dateListDayMonthYear() methode implementeren.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
robbert schreef op dinsdag 18 december 2007 @ 15:37:
Een preg_replace_callback zal hier toch echt een stuk sneller zijn, dan hoeft die namelijk niet n keer een regex uit te voeren.

PHP:
1
2
3
4
5
6
7
$count = 0;
function replaceDateList() {
  global $count, $form;
  $form->dateListDayMonthYear($count++)
}

$template = preg_replace_callback($repexp, "replaceDateList", $template);


Je zou het in een klasse kunnen stoppen om die vieze globals te vermijden
Oke, snelheid is altijd fijn na een paar kleine aanpassing aan mijn functies werkte ook dit script super in een test document:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$count = 0;
$regExp="{.dateListDayMonthYear.}";

function replaceDateList() {
  global $count, $form;
  return $form->getDateList($count++);
}

$template=file_get_contents("form.html");

$template = preg_replace_callback($regExp, replaceDateList, $template); 

echo $template;


Nu wil ik dit stuk echter in een classe zetten zoals je aangaf, dan gaat het mis:

Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, 'replaceDateList', to be a valid callback in C:\Program Files\Wamp\www\test\libs\form.class.php on line 13

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class form{

private $counter=0;

function parseForm(){
    $regExp="{.dateListDayMonthYear.}";
    $template=file_get_contents("form.html");
    $template = preg_replace_callback($regExp, $this->replaceDateList, $template); 

    return $template;
}


function replaceDateList() {
  return $this->getDateList($this->counter++);
}

function getDateList($uniqueId=""){
...
}


Na wat testen vermoed ik dat dit stukje: $this->replaceDateList de boosdoener is, echter snap ik niet waarom dit niet werkt?
Ik verwijs naar een functie binnen in mijn classe dus $this->functienaam

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Wat een valid callback is staat in de manual uitgelegd onder Pseudo-types and variables used in this documentation.

Mocht je HTML id-attributen genereren dan is het trouwens aan te bevelen om toch te kijken naar een static (property). Voor het geval je ooit meerdere formulieren op een pagina gaat plaatsen...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Met de goede callback en die counter static zul je het volgende krijgen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class form{

private static $counter=0;

function parseForm(){
    $regExp="{.dateListDayMonthYear.}";
    $template=file_get_contents("form.html");
    $template = preg_replace_callback($regExp, array($this, "replaceDateList"), $template); 

    return $template;
}


function replaceDateList() {
  return $this->getDateList(self::$counter++);
}

function getDateList($uniqueId=""){
...
}

Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
robbert schreef op dinsdag 18 december 2007 @ 17:38:
Met de goede callback en die counter static zul je het volgende krijgen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class form{

private static $counter=0;

function parseForm(){
    $regExp="{.dateListDayMonthYear.}";
    $template=file_get_contents("form.html");
    $template = preg_replace_callback($regExp, array($this, "replaceDateList"), $template); 

    return $template;
}


function replaceDateList() {
  return $this->getDateList(self::$counter++);
}

function getDateList($uniqueId=""){
...
}
Werkt super, ga me toch is verdiepen in die callbacks, static, ... stond toch niet zo ver met php als ik dacht ;)

Modelbouw - Alles over modelbouw, van RC tot diorama

Pagina: 1