Ik heb een probleempje met preg_replace_callback.
Het gaat om een simpele expressie: '/\[x\](.*?)\[\/x\]/'

Alles werkt, behalve als er in de tekst tussen de [x] en [\x] een newline staat. Het maakt niet uit of nl2br al gelopen heeft, met eerst de functie nl2br toe te passen krijg ik hetzelfde resultaat.
Het resultaat is dat de [x] en [\x] letterlijk in het resultaat op de pagina terechtkomt, dit is uiteraard niet de bedoeling.

Weet er iemand iets van dit probleem met preg_replace_callback, en nog belangrijker, heeft iemand een oplossing voor mij?

Alvast bedankt aan al die grijze massa die voor mij samenwerkt...
Gebruik deze regex:

_\[b\](.*?)\[/b\]_s

De pattern modifier 's' zorgt ervoor dat een . ook newlines matched.
puur uit nieuwsgierigheid, wat is de functie van die _ in de regex?
Enorm bedankt, werkt perfect...
Hetzelfde als de / in jouw regex. Het is de delimiter die de preg_* functie nodig heeft.

De _ geeft vind ik persoonlijk een overzichtelijkere regex aangezien je niet elke keer het gebruik van de / hoeft te escapen. Andere handige delimiters zijn bijvoorbeeld # en ~, tekens dus die je niet snel in een regex tegen zult komen...
Als dit voor bb-codes zijn dat zou ik ook rekening houden met spaties en hoofdletters. Ook is het dat best nutteloos als er niets tussen de tags staat.


_\[ *b *\](.+?)\[ */ *b *\]_si
Waar staat die i voor achteraan?

Die spaties is niet zo belangrijk, het moet maar goed ingevoerd worden.

Als er niets tussen de tags staat moet het nog wel altijd geparsed worden, anders blijven de [] staan in de tekst
De i zorgt ervoor dat de regex case insensitive wordt. Zie ook het hoofdstuk over pattern modifiers uit de PHP handleiding.

Wat betreft die spaties, die zou ik persoonlijk juist niet meenemen. Ik zou niet willen dat een string met daarin bijvoorbeeld [ignore][ b]blaat[ /b][/ignore] geparsed werd. Veelal wordt dat namelijk door mensen gebruikt om de tags gewoon weer te geven...
i staat voor insensitive (ongevoelig) voor hoofd/kleine letters.

Als je dit hebt: /martijn/i

Dan pakt het pattern "martijn", "MaRtijn", etc.

@Blanche:

Dat is waar inderdaad, niet aan gedacht.

Martijn! schreef op 18.01.2008 20:36
Dat is waar inderdaad, niet aan gedacht.
Offtopic: voor het matchen van spaties zou ik \s gebruiken. Dat geeft meer duidelijkheid in je regex dan enkel een lege spatie...

Vergelijk:

_[a-z]+ ?[a-z]+_is
_[a-z]+\s?[a-z]+_is

In de eerste regex zou je nog in verwarring gebracht kunnen worden en denken dat de ? bij de + zou horen. Maar dat zal een hele andere uitwerking geven!
Een beetje een vervolg op dit topic, dus ik doe hier maar verder.
Alvast bedankt voor de vorige oplossing (en uitleg), dat werkt nu perfect (en ik heb wat bijgeleerd).

Ik wil nu een functie toepassen op de hele tekst, behalve op het stuk dat matched met die specifieke regex.
Ik had al in alle gevallen waar de tekst matched met een andere regex de functie toegepast, maar realiseerde me dan dat de functie dan niet toegepast is op de stukken tekst die nergens mee matchen.
Hoe kan ik dit oplossen?

Reageren