[PHP] functie in preg_replace

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46
Hoi tweakerts,

ben 4 dagen geleden begonnen met regular expressions, ben het erg vaak tegen gekomen, maar nooit echt naar gekeken. Omdat ik ze nou toch echt nodig heb om een UBB-tag systeempje te maken, en het werkt inderdaad erg makkelijk.
maar nu wou ik het wat ingewikkelder maken, door een functie aan te roepen IN de replace-string.

Door te searchen ben ik wel een aantal dingen tegen gekomen dat je een functie kan aanroepen in de replace van een preg_replace, maar daar gebruiken ze steeds $1, en bij mij werkt dat niet. 1 mee geven aan een functie werkt ook niet.

code wat ik nou heb:
PHP:
1
2
3
4
5
6
7
8
<?PHP
function testje($string)
{
  return $string;
}

  $string = preg_replace("_[code]((.|\n)*)[/code]_iU", "<code>1</code>", $string);
?>
hier maakt ie dus nog geen gebruik van de functie testje();
dus ik probeer zoiets:
PHP:
1
2
  $string = preg_replace("_[code]((.|\n)*)[/code]_iU",
                         "<code>".testje(1)."</code>", $string);
Dat geeft:
Warning: Unexpected character in input: '' (ASCII=92) state=1

volgende probeersel:
PHP:
1
2
  $string = preg_replace("_[code]((.|\n)*)[/code]_iU",
                         "<code>".testje($1)."</code>", $string);
en dat geeft:
Parse error: parse error, expecting `T_VARIABLE' or `'$''
Waarschijnlijk zal ik iets in het ((.|\n)*) gedeelte moeten veranderen, maar wat kan ik niet achterkomen.

Hopelijk heb ik alle benodigde info gegeven en mijn excusses als het erg makkelijk is, maar ik kan het echt niet vinden.

[edit]
om de een of andere reden wordt de slash voor de n er steeds uitgehaald als ik op Bekijk bericht klik...

[ Voor 36% gewijzigd door KompjoeFriek op 14-11-2003 12:11 . Reden: layout fix ]

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Dit zou moeten werken (niet getest):
PHP:
1
"<code>'.testje('\1').'</code>"
Check ff d usercomments bij preg_replace :)

[ Voor 55% gewijzigd door RedRose op 14-11-2003 12:21 ]

Sundown Circus


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46
RedRose schreef op 14 november 2003 @ 12:19:
Dit zou moeten werken (niet getest):
PHP:
1
"<code>'.testje('\1').'</code>"
Check ff d usercomments bij preg_replace :)
OMG! je bent een held!
sorry, heb de user comments ook gezien, maar ik zal er wel overheen gelezen hebben, het was laat gisteren :X

maar anyway, het werkt perfect! erg bedankt!

[edit]
als ik nou een preg_replace wil doen in de functie die wordt aangeroepen in een preg_replace, dan werkt ie niet! (als ik de functie los aanroep werkt wij weer wel, dus aan de functie zelf ligt het niet)

[ Voor 24% gewijzigd door KompjoeFriek op 14-11-2003 12:40 ]

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

op het moment dat je een match door een functie wilt gaan halen zul je de /e modifier moeten gebruiken, of gebruik maken van de preg_replace_callback functie :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

crisp schreef op 14 november 2003 @ 12:33:
op het moment dat je een match door een functie wilt gaan halen zul je de /e modifier moeten gebruiken, of gebruik maken van de preg_replace_callback functie :)
Dat klopt. :) Ik geloof dat je bij preg_replace_callback alleen de matches als argument kan opgeven in de callback-functie en bij gebruik van preg_replace en de e-modifier ook andere dan alleen de matches. :)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46
Jammer genoeg krijg het ook niet voor elkaar om dus weer een preg_replace te gebruiken in de functie die door een preg_replace wordt aangeroepen, maar dat terzijde.

het probleem wat ik nu heb, is dat er veel loze enters in het resultaat komen omdat in nl2br(); gebruik.

Ik gebruik voor het maken van een tabel de tags [table] [tr] [th] [td] met bijbehorende sluit-tags.

als ik nu voor de opmaak enters tussen de tags zet, bijvoorbeeld zo:
code:
1
2
3
4
5
6
7
8
9
10
[table]
[tr]
[th]kopje 1[/th]
[th]kopje 2[/th]
[/tr]
[tr]
[td]regel 1[/td]
[td]regel 1[/td]
[/tr]
[/table]
dan krijg ik elke enter boven de tabel. dat is niet erg fijn. nou probeer ik die weg te krijgen met:
PHP:
1
2
3
  $string = preg_replace("_\\[table\]((.|\n)*)\\[tr\]_iU", "[table][tr]", $string);
  $string = preg_replace("_\\[/tr\]((.|\n)*)\\[tr\]_iU", "[/tr][tr]", $string);
  $string = preg_replace("_\\[tr\]((.|\n)*)\\[td\]_iU", "[tr][td]", $string);
maar de code op regel 3 molt de hele header uit de tabel, omdat die ook tussen een [tr] en een [td] tag staat :(

Kan dat ook op een andere manier?

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

zoek eens uit wat het verschil is tussen greedy en non-greedy matchen.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46
Via de search ben ik er achtergekomen dan preg_replace standaard niet greedy is, en dat heb ik nodig lijkt me :?

greedy zelf lijkt me dat ie greetig is, en probeerd zo veel mogelijk overeen te komen met de expression, of ben ik nou erg aan het zwammen?

Ik krijg nog steeds niks werkend via preg_replace.
heb ook al een flink stuk code gebouwd waarin ik aan de slag ga met explode en die shit, maar daar krijg ik het ook al niet voor elkaar :(
maar ik ga nog een poging wagen...

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

elke regexp is standaard greedy tenzij je een modifier toepast. Je gebruikt zelf al de generieke U modifier waardoor je ungreedy matched, dus dat is goed. Ik denk dat je nat gaat op het feit dat een linebreak in windows niet \n maar \r\n is. Je zou kunnen overwegen de s-modifier (PCRE-dot-ALL) toe te passen, dan krijg je gewoon zoiets:

PHP:
1
2
3
$string = preg_replace("_\\[table\].*\\[tr\]_isU", "[table][tr]", $string); 
$string = preg_replace("_\\[/tr\].*\\[tr\]_isU", "[/tr][tr]", $string); 
$string = preg_replace("_\\[tr\].*\\[td\]_isU", "[tr][td]", $string);


voor de volledigheid: er is ook een ungreedy quantifier:

PHP:
1
$string = preg_replace("_\\[table\].*?\\[tr\]_is", "[table][tr]", $string);


het vraagteken maakt de * quantifier ungreedy, de rest van de regexp blijft greedy

[ Voor 19% gewijzigd door crisp op 14-11-2003 17:28 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46
Bedankt voor de uitleg, maar of ik hem greedy maak of niet, hij blijft doen wat ik niet wil, beide doen ze het fout, doordat hij delen weggooit die niet wegmogen, dus heb ik zelf maar een functie geschreven die wel het gewenste resultaat geeft, ookal is het niet 1337 :P
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function tabelParser($tabel)
{
  $rij = explode("[",$tabel);
//  print_r($rij);
  $resultaat = "";
  foreach($rij as $a => $b)
  {
    $b = trim($b);
    if (substr($b, 0, 6)=="table]")
      $b = str_replace("<br />","",$b);
    if (substr($b, 0, 3)=="tr]")
      $b = str_replace("<br />","",$b);
    if (substr($b, 0, 4)=="/tr]")
      $b = str_replace("<br />","",$b);
    if (substr($b, 0, 4)=="/th]")
      $b = str_replace("<br />","",$b);
    if (substr($b, 0, 4)=="/td]")
      $b = str_replace("<br />","",$b);
      
    $resultaat = $resultaat."[".$b;
  }
  
  $resultaat = substr($resultaat,1);
  
  return $resultaat;
}
en php draaid lokaal op een debian bak met apache 1.4.x en php4, dus heb niks te maken met \n, \r of \n\r want ik gebruik nl2br() zodat hij er zelf al <br /> van maakt ;)

iig bedankt iedereen, ik snap nou wel ongeveer wat ik met regex kan _/-\o_
offtopic:
crisp, wanneer verwacht je dat pumpkins af is? vond je originele versie al gaaf om te spelen :P

WhatPulse! - Rosetta@Home - Docking@Home

Pagina: 1