Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [PHP] preg_replace() (https://forum.scholieren.com/showthread.php?t=543740)

Martin 17-07-2003 22:15

[PHP] preg_replace()
 
Ik ben nu bezig om met PHP een UBB-parser te maken, maar ik loop vast bij een opsomming.

Ik moet dus dit kunnen doen: (1 sterretje per rij wegdenken)

Code:

[list*]
[**] item
[**] item
[**] item[/list*]

En dan moet hij er dit van maken:
  • item
  • item
  • item

Dan kan ik wel dit doen:
PHP-code:

$txt preg_replace("/\[list\](.+?)\[\/list\]/is",'<ul>\1</ul>'$txt); 

Maar als ik dan een fout heb gemaakt in[*], door bijvoorbeeld [**] te doen, dan zet hij de[list] wel om, maar dat moet dan niet omdat er een fout in de code zit.

Ik moet dus eigenlijk kijken of er TUSSEN[list] en [SLASH/list]een rij is met[*]. Is dit niet zo, dan mag[list] ook niet worden geparsed.

Wie weet de oplossing?

belgo 18-07-2003 12:29

Weet je zeker dat dit sowieso werkt?
Blokhaken hebben namelijk zelf ook een functie in de regexp, ze groeperen namelijk mogelijke tekens.

Bovendien gebruik je een / (forwardslash) IN je regexp, terwijl dat teken de velden in een regexp van elkaar scheidt (s/voor/na/).

Het (.+?) stukje klopt in mijn ogen ook niet; de plus zegt dat het voorgaande patroon (. = alles behalve newline) één of meer keer herkend moet worden. Het vraagteken zegt daarentegen dat patroon NUL of één keer herkend moet worden. Ik denk dat je in dit geval alleen de + bedoelt :)

PHP-code:

$txt preg_replace("/\\[list\\](.+)\\[\\/list\\]/is",'<ul>$1</ul>'$txt); 

Dit werkt al beter..

Om je echte probleem op te lossen, zul je het (.+) gedeelte moeten vervangen door een regexp die vereist dat het patroon[*] één of meer keer voorkomt.

PHP-code:

$txt preg_replace("/\[list\](.*\[\*\]+.*)\[\/list\]/is",'<ul>$1</ul>'$txt); 

Werkt in dit geval volgens mij goed. :)

Nu komt het grotere probleem.. de[*] vervangen met <li></li>.. dat kan nog lastig worden, dus success!

eddie 18-07-2003 14:53

Citaat:

belgo schreef op 18-07-2003 @ 13:29:

Het (.+?) stukje klopt in mijn ogen ook niet; de plus zegt dat het voorgaande patroon (. = alles behalve newline) één of meer keer herkend moet worden. Het vraagteken zegt daarentegen dat patroon NUL of één keer herkend moet worden. Ik denk dat je in dit geval alleen de + bedoelt :)

Incorrect. De . (punt) geeft aan dat elk willekeurig karakter geldt, de + (plus) betekend één of meer keer, en de ? (vraagteken) betekent niet greedy (zo min mogelijk matchen). De regexp was dus wel goed.

belgo 18-07-2003 15:03

Citaat:

eddie schreef op 18-07-2003 @ 15:53:
Incorrect. De . (punt) geeft aan dat elk willekeurig karakter geldt, de + (plus) betekend één of meer keer, en de ? (vraagteken) betekent niet greedy (zo min mogelijk matchen). De regexp was dus wel goed.
Ah.. dat 'greedy / not greedy' gedoe heb ik nooit goed begrepen.

Code:

[list.][*] 1[*] 2[*] enz..[/list][list.][*] A[*] B[*] enz..[/list]
Bij 'not greedy' zou de .+ dan alles tussen de eerste[list.] en de laatste[/list.] pakken:

Code:

[*] 1[*] 2[*] enz..[/list][list.][*] A[*] B[*] enz..
En bij 'greedy' zou de .+? alles tussen de eerste[list.] en de eerste[/list.] pakken.

Code:

[*] 1[*] 2[*] enz..
ofzo :confused:

eddie 18-07-2003 15:24

Citaat:

belgo schreef op 18-07-2003 @ 16:03:
Ah.. dat 'greedy / not greedy' gedoe heb ik nooit goed begrepen.
*verhaal*

bijna goed.

De greedy (gretig) pakt alles tussen de aller eerste en de aller laatste.
Bij
Code:

[list ][*]1[*]2[/list ][list ][*]3[*]3[/list ]
Zou .* (greedy) het volgende matchen (met /\[list\](.*)\[\/list\]/, en zal $1 het volgende bevatten:
Code:

[*]1[*]2[/list][list][*]3[*]3
Met not greedy (niet greetig) (/\[list\](.*?)\[\/list\]/):
Code:

[*]1[*]2
not greedy matched dus zo weinig mogelijk. Greedy matched zoveel mogelijk

belgo 18-07-2003 15:39

nice, bedankt!

(nu weer on-topique =P)


Alle tijden zijn GMT +1. Het is nu 12:59.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.