[PHP] klein probleempje met preg_replace

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

ik wil twee vaste waarden en een variabele waarde tezamen vervangen.

de input is bijvoorbeeld:
[blokje] Hoi, ik ben Jan [/blokje]
nu wil ik bovenstaande regel in zijn geheel vervangen door [...], ongeacht wat de waarde is tussen de [blokje] blocks.

hiervoor wilde ik het volgende gebruiken:
$text = "[blokje] Hoi, ik ben jan [/blokje];
$pattern = "/\[blokje\].*\[\/blokje\]/";
$replacement = "[...]";
$format = preg_replace($pattern, $replacement, $text);

In bovenstaande situatie doen zich geen problemen voor. $text wordt netjes vervangen door [...]

Als ik echter $text = $data['bericht'] gebruik (die haal ik uit een database) dan wordt er helemaal niets meer vervangen. Hier snap ik dus echt niets van.

Weer iemand hoe ik dit kan verhelpen?

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Laat dan eens zien welke tekst je uit de database krijgt? :)

Ofwel, doe eens een echo $data['bericht'];

[ Voor 27% gewijzigd door Gonadan op 18-04-2007 10:45 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 18-09 23:26

Tjark

DON'T PANIC

en iig moet het
PHP:
1
$pattern = '/\[blokje\].*?\[\/blokje\]/i';

zijn anders heb je evt een probleem met
$text = "[blokje] Hoi, ik ben Jan [/blokje] blaat [blokje] Hoi, ik ben Piet [/blokje]";

(en ook de [ moet je escapen)

[ Voor 7% gewijzigd door Tjark op 18-04-2007 10:51 ]

*insert signature here


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Tjark Verhoeven schreef op woensdag 18 april 2007 @ 10:48:
en iig moet het
PHP:
1
$pattern = '/\[blokje\].*?\[\/blokje\]/i';

zijn anders heb je evt een probleem met
$text = "[blokje] Hoi, ik ben Jan [/blokje] blaat [blokje] Hoi, ik ben Piet [/blokje]";

(en ook de [ moet je escapen)
Dat eerste probleem los je op met de ungreedy modifier.

Dat tweede heb je helemaal gelijk in.

@TS:
Ik begin het gevoel te krijgen dat je een soort BB-code wilt gaan gebruiken.
Zoek dan maar eens op 'stackbased BB parsen', dat is een veel gebruikte en goede methode. :)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 18-09 23:26

Tjark

DON'T PANIC

Gonadan schreef op woensdag 18 april 2007 @ 10:54:
[...]

Dat eerste probleem los je op met de ungreedy modifier.
he, bah.... laten we gewoon posix regexps gebruiken ;)

*insert signature here


Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
Kun je niet zeggen dat hij alles moet ophalen tussen [blokje] [/blokje] behalve [/blokje] zodat die blokje per blokje pakt :?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gonadan schreef op woensdag 18 april 2007 @ 10:44:
Laat dan eens zien welke tekst je uit de database krijgt? :)

Ofwel, doe eens een echo $data['bericht'];
als ik $data['bericht'] echo, krijg ik gewoon het goede bericht in text uit de mySQL database.

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Verwijderd schreef op woensdag 18 april 2007 @ 11:42:
[...]

als ik $data['bericht'] echo, krijg ik gewoon het goede bericht in text uit de mySQL database.
Dat geloof ik. Maar als we weten wat voor tekst dat is dan kunnen we misschien zien waarop hij onderuit gaat. :)

Maar ik denk dat de oplossing al gegeven is door Tjark. ;)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gonadan schreef op woensdag 18 april 2007 @ 11:46:
[...]

Dat geloof ik. Maar als we weten wat voor tekst dat is dan kunnen we misschien zien waarop hij onderuit gaat. :)

Maar ik denk dat de oplossing al gegeven is door Tjark. ;)
die tekst is altijd anders :P, maar in sommige gevallen staan er dus [blokje] en [/blokje] blocks in. die (+ de tussenliggende tekst) wil ik vervangen door [...]

Ik kan hier wel een bericht uit de database neerzetten maar ik denk dat dat weinig toevoegd.

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Nou nee, zet eens een bericht neer. Zoals Gonadan zegt: Dan kunnen we kijken waar het fout gaat.
Als in: testen e.d.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
[blokje]op 18-04-2007 10:49 schreef [user]Nieuwsje[/user] het volgende: Mooie site hoor! Je kan wel zien dat deze site door de ekte player is gemaakt. Maar ik spreek je binnekort wel weer, Laters [/blokje] Nieuwsje je moet niet meteen beginnen...

als ik de tekst zo invoer als
$text = "[blokje]op 18-04-2007 10:49 schreef [user]Nieuwsje[/user] het...etcetc";

gaat het goed!

als ik de text echter uit de database haal, gaat het mis, terwijl de tekst natuurlijk precies hetzelfde is.

[ Voor 4% gewijzigd door Verwijderd op 18-04-2007 14:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oh en ik weet niet of het uitmaakt maar hij staat als type 'longtext' in de database :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ben je niet variabelenamen aan het verwisselen? Je slaat de veranderde tekst op in $format, maar in al je verdere posts in dit topic zeg je dat je naar $text zit te kijken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
@ -NMe-: Ik hoop het niet ;)

@TS:
Heb je de blokhaken onderhand al escaped? :)
Al denk ik dat het niet echt het probleem kan zijn moeten ze toch echt escaped worden om het definieren van een character-class te voorkomen. :)

[ Voor 47% gewijzigd door Gonadan op 18-04-2007 14:10 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op woensdag 18 april 2007 @ 14:06:
Ben je niet variabelenamen aan het verwisselen? Je slaat de veranderde tekst op in $format, maar in al je verdere posts in dit topic zeg je dat je naar $text zit te kijken.
sorry, had hier iets structureler in moeten zijn, maar dit is absoluut niet het probleem. nogmaals:

dit werkt:
PHP:
1
2
3
4
$text = "[blokje] Hoi, ik ben jan [/blokje]";
$pattern = "/[blokje\].*[\/blokje\]/";
$replacement = "[...]";
$format = preg_replace($pattern, $replacement, $text);


dit werkt niet:
PHP:
1
2
3
4
$text = $data['bericht'];
$pattern = "/[blokje\].*[\/blokje\]/";
$replacement = "[...]";
$format = preg_replace($pattern, $replacement, $text);


Het gaat dus mis als ik de text uit de database haal. De text haal ik uit een mySQL database en ['bericht'] wordt opgeslagen als 'longtext'.

[ Voor 43% gewijzigd door Verwijderd op 18-04-2007 14:18 ]


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Er staan niet toevallig new-line tekens in de tekst uit de database?

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
PHP:
1
$pattern = "/[blokje\].*[\/blokje\]/";

moet zijn
PHP:
1
$pattern = "/\[blokje\].*\[\/blokje\]/";

zoals al eerder aangegeven. :)
En dan eigenlijk nog
PHP:
1
$pattern = "/\[blokje\].*\[\/blokje\]/U";

vanwege de greediness. ;)

[ Voor 26% gewijzigd door Gonadan op 18-04-2007 14:22 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Verwijderd schreef op woensdag 18 april 2007 @ 14:09:
[...]

sorry, had hier iets structureler in moeten zijn, maar dit is absoluut niet het probleem. nogmaals:

dit werkt:
PHP:
1
2
3
4
$text = "[blokje] Hoi, ik ben jan [/blokje]";
$pattern = "/[blokje\].*[\/blokje\]/";
$replacement = "[...]";
$format = preg_replace($pattern, $replacement, $text);


dit werkt niet:
PHP:
1
2
3
4
$text = $data['bericht'];
$pattern = "/[blokje\].*[\/blokje\]/";
$replacement = "[...]";
$format = preg_replace($pattern, $replacement, $text);


Het gaat dus mis als ik de text uit de database haal. De text haal ik uit een mySQL database en ['bericht'] wordt opgeslagen als 'longtext'.
Heb je
PHP:
3
$format = preg_replace($pattern, $replacement, $data['bericht']);
geprobeert? :)
Misschien werkt dat wel en lijkt me ook logischer eigenlijk... :)
Als dat ook niet werkt, check dan of $data[' bericht'] überhaupt een waarde heeft... :)

[ Voor 74% gewijzigd door CH4OS op 18-04-2007 14:25 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

WormLord schreef op woensdag 18 april 2007 @ 14:18:
Er staan niet toevallig new-line tekens in de tekst uit de database?
Zeg er dan meteen bij dat 'ie in dat geval de dotall-modifier nodig heeft en er dus een s achter zijn pattern moet staan. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
WormLord schreef op woensdag 18 april 2007 @ 14:18:
Er staan niet toevallig new-line tekens in de tekst uit de database?
jawel! maar dat moet toch niet uitmaken? als er een [blokje] instaat begint de eerste zin daar altijd mee!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heren! het is opgelost! dat het zo makkelijk was had ik natuurlijk weer niet verwacht. er moest een 's' achter mijn pattern (dank aan -NMe-), omdat er newlines in het bericht stonden.

Bedankt voor alle hulp, ik heb zeker iets geleerd van jullie! En dat is waar het om gaat ;) :*)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 21:18

crisp

Devver

Pixelated

Tjark Verhoeven schreef op woensdag 18 april 2007 @ 10:48:
en iig moet het
PHP:
1
$pattern = '/\[blokje\].*?\[\/blokje\]/i';

zijn anders heb je evt een probleem met
$text = "[blokje] Hoi, ik ben Jan [/blokje] blaat [blokje] Hoi, ik ben Piet [/blokje]";
maar dan heb je wel weer een probleem met:
$text = "[blokje] Hoi, ik ben Jan [blokje] blaat [/blokje] Hoi, ik ben Piet [/blokje]";
;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
crisp schreef op woensdag 18 april 2007 @ 14:44:
[...]

maar dan heb je wel weer een probleem met:
$text = "[blokje] Hoi, ik ben Jan [blokje] blaat [/blokje] Hoi, ik ben Piet [/blokje]";
;)
Vandaar dus stackbased parsen. ;)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8

Pagina: 1