[php] preg_replace met functie met argument als replace

Pagina: 1
Acties:

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
ik heb een probleempje met m'n eigen parsing engine

ik heb een stukje php code welk een text doorzoekt en dan ee functie aanroept als replace argument,

nu geef ik aan die functie als eerste argument het gevonden stukje text mee maar odmat de functie recursief wordt gebruikt moet ik ook een 2e argument meegeven, heeft iemand enig idee hoe dat te doen?

PHP:
1
2
3
4
5
function parse($input, $vars=""){
    
    $output=preg_replace("/\\[(.*?)\]/e","strfunct('$1', '$vars')",$input);
    return $output;
}


als ik nu vars uitlees want een array moet zijn dan ziet hij het iid als een array maar alle waardes zijn teruggezet op hoofdletter a "A"

weet iemand hoe dit komt? en hoe ik dit kan verhelpen?
deze functie moet straks ook recursiefe dubbele paren gaan vinden.

code:
1
2
3
4
5
6
[x]
 text
  [x]
  iets  
  [/x]
[/x]


maar daar ben ik nog niet 100% aan toe, maar voor de volledigheid er toch bij gezet. alvast bedankt.

openkat.nl al gezien?


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
dudes, geen enkele reactie?

acm/drm/tuinhark desnoods kom op mensen dr is hier toch wel een oplossing voor?
mischien is er een logishe manier om de vars op een andere manier in die functie te krijgen zonder die scope te verliezen?

alvast bedankt.

openkat.nl al gezien?


  • Postman
  • Registratie: Februari 2000
  • Laatst online: 15-08 20:11
Ik weet niet wat je precies wilt, maar kijk eens in de source van bv. phpBB. Daar gebruiken ze ook regex om [ url] [/ url] te doen e.d.
Ik gebruik ze nu ook voor mijn eigen parsing engine (heb ze niet geript, alleen bestudeert naar de werking). Deze werken ook recursief.
code:
1
[url=http://www.bla.com][img]http://www.bla.com/bla.jpg[/img][/url]

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
ik wil een variabele meegeven aan de functie die aangeroepen word door de replace functie als het replace argument, ik geef dus al het gevonden text mee aan die functie maar ik wil ook een externe functie meegeven.

openkat.nl al gezien?


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik durf te wedden dat je "strfunct('Array'," in je code krijgt, wellicht kan je de $1 nog escapen ? (naar \$1 dus)
Maar of dat werkt weet ik niet.

  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
ik snap niet wat je bedoeld maar onderstaande code werkt wel:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$vars=array("een","twee");
$bli = parse("sdf[hoi] dsf sd", $vars);

function parse($input, $vars){ 
     
    $output=preg_replace("/\\[(.*?)\]/e","strfunct($1, \$vars)",$input); 
    return $output; 
}

function strfunct($a, $b){
    foreach($b as $next){
        echo $a . " - " . $next . "<br>";
    }
}

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

GiLuX schreef op 12 september 2002 @ 12:43:
ik snap niet wat je bedoeld maar onderstaande code werkt wel:

Doe es moeite om er over na te denken dan :)

PHP:
1
2
3
4
5
6
$var = array(1, 2, 3);
echo $var[0];
echo $var;
$var2 = "$var";
echo $var2[0];
echo $var2

De output zal zijn:
"1", "Array", "A", "Array".
(waarbij die A de eerste waarde van de string "Array" is ;) )
En nu terug naar je eval-ding en deze kennis interpoleren :)

  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
ik snap het nog steeds niet wat de poster nou bedoeld wil, en ik heb er al veelste lang over na zitten denken...

mijn output van hierboven is gewoon:
hoi - een
hoi - twee

so???

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
oke here comes again

ik wil dus in mijn replace een functie aanroepen

deze functie krijgt als eerste argument de gevonden waarde mee $1, dit werkt perfect
nu moet hij als 2e variabele de array vars doogeven maar dan krijg ik voor alle waardes in die array alleen de waarde A terug

zoals ik hierboven zie komt de array dus wel door in die functie maar is er iets fout met die array zelf, of nie?

zal ik even wat meer code geven? bevoorbeeld wat voor array er in gaat en wat er uit komt?

openkat.nl al gezien?


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
als ik de quotes weghaal rond de argumenten net zoals in het voorbeeld hierboven gaat hij op z'n bek zodra ik strings met spaties invoer.

ik krijg een error:

Parse error: parse error, unexpected ')' in C:\Inetpub\wwwroot\parse\index.php(18) : regexp code on line 1

die aangeeft dat de functie aangeroepen word zonder quotes om de texten die als argumenten worden opgegeven, dus ik heb quotes nodig rond de argumenten van de functie.

openkat.nl al gezien?


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

GiLuX schreef op 12 september 2002 @ 13:12:
ik snap het nog steeds niet wat de poster nou bedoeld wil, en ik heb er al veelste lang over na zitten denken...

mijn output van hierboven is gewoon:
hoi - een
hoi - twee

so???

Die code (letterlijk) geeft bij mij de output "1ArrayAArray" (letterlijk).
killercow schreef op 12 september 2002 @ 13:56:
oke here comes again

ik wil dus in mijn replace een functie aanroepen

deze functie krijgt als eerste argument de gevonden waarde mee $1, dit werkt perfect
nu moet hij als 2e variabele de array vars doogeven maar dan krijg ik voor alle waardes in die array alleen de waarde A terug

zoals ik hierboven zie komt de array dus wel door in die functie maar is er iets fout met die array zelf, of nie?

zal ik even wat meer code geven? bevoorbeeld wat voor array er in gaat en wat er uit komt?
Nee, je geeft domweg het WOORD "Array" mee aan je functie omdat php de array om probeert te zetten naar een string (je bent tenslotte een variabele tussen "" aan het plaatsen), dit gaat niet goed. Eval moet de $var letterlijk meekrijgen, ipv de tekstuele waarde van $var (die dus "Array" is).

Kortom je moet \$var opsturen, zodat er $var bij de code-evaluator komt, de naam van de array en niet diens tekstuele waarde.

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
ahhh hahaha jippy

t werkt
de eerste moet met quotes omdat de waarde anders in de soep loopt, de funcite krijgt namenlijk niet een verweizing naar $1 maar de waarde van $1 van de replace functie, deze moet dus met quotes, de 2e waarde wordt idd gewoon doorgegeven maar moet geescaped worden, you are the best!

allebei heeeeel erg bedankt voor jullie hulp. hopenlijk zijn we er allemaal iets slimmer van geworden.

openkat.nl al gezien?


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
ACM schreef op 12 september 2002 @ 14:06:
[nohtml]
[...]
Kortom je moet \$var opsturen, zodat er $var bij de code-evaluator komt, de naam van de array en niet diens tekstuele waarde.
dat is toch precies wat ik doe?!?!?

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
ja maar jij hebt ook de $1 niet tussen quotes en die moet wel
aangezien er in jouw voorbeeld dit gedaan wordt:

strfunct(hoi, $vars);
en dan zou eigenlijk al niet kunnen natuurlijk.
de hoi moet wel tussen quotes en daar kwam ik achter toen ik
[hoi a=test b=blaat] aan het testen was
is er trouwens een beetje handige manier om te splitten op argumenten? ik explode nu op spatie maar ik wil graag ook dat de argumenten "" kunnen hebben met daartussen spaties enzo.
ik krijg nu dus een array met daarin als eerste element de tag en als volgende elementen de argument waarde paren met een = teken er tussen

openkat.nl al gezien?


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

GiLuX schreef op 12 september 2002 @ 14:15:
dat is toch precies wat ik doe?!?!?

Ja, maar ik gaf meer aan waarom het bij de topicstarter fout gaat.
Pagina: 1