[PHP] preg_replace - regular expression

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
Heb een klein probleempje met mijn reg-ex scriptje dat bepaalde BB code moet omzetten naar HTML

Hier zie je even een voorbeeld van wanneer het fout gaat
PHP:
1
2
3
4
5
6
7
8
$newspost = "[b][i][u]vet schuin onderlijnen[/u][/i][/b]";

$htmlpost = preg_replace("#\\[b\]([^\\[]*)\\[/b\]#","<b>\\1</b>",$newspost);
$htmlpost = preg_replace("#\\[i\]([^\\[]*)\\[/i\]#","<i>\\1</i>",$htmlpost);
$htmlpost = preg_replace("#\\[u\]([^\\[]*)\\[/u\]#","<u>\\1</u>",$htmlpost);

echo $htmlpost;
//output = [b][i]<u>vet schuin onderlijnen</u>[/i][/b]



Dit gaat dan weer goed, want nu loopt hij gelijk met de omzetting scripts
PHP:
1
2
3
4
5
6
7
8
$newspost = "[u][i][b]vet schuin onderlijnen[/b][/i][/u]";

$htmlpost = preg_replace("#\\[b\]([^\\[]*)\\[/b\]#","<b>\\1</b>",$newspost);
$htmlpost = preg_replace("#\\[i\]([^\\[]*)\\[/i\]#","<i>\\1</i>",$htmlpost);
$htmlpost = preg_replace("#\\[u\]([^\\[]*)\\[/u\]#","<u>\\1</u>",$htmlpost);

echo $htmlpost;
//output = <u><i><b>vet schuin onderlijnen</b></i></u>

Nu wat mijn vraag is hoe ik mijn script moet aanpassen zodat het niet uitmaakt met welke tag ik eerst begin, dat het altijd werkt. Kan iemand hierbij helpen ?

[ Voor 53% gewijzigd door imp4ct op 02-02-2006 00:31 ]

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

je moet tussen de begin en de eind tag alles matchen, behalve de eind tag zelf, niet tot de eerst volgende tag

Acties:
  • 0 Henk 'm!

Verwijderd

Het probleem is, dat je in de regexp "[" uitsluit, in het eerste geval, matched hij dus op de eerste regel niet, want tussen de [ b ] en [ / b ] staat nog een "[", idem voor de 2e regel, pas bij de derde regel is er een match: [ u ] en [ / u ], zonder "[" daartussen...

[ Voor 10% gewijzigd door Verwijderd op 02-02-2006 00:38 . Reden: Aanpassing voor het GOT script die de tags wel goed pakte :-) ]


Acties:
  • 0 Henk 'm!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
En wat zou dan de juiste rege-ex zijn ?

Sorry dat het zo hulpeloos overkomt, maar ik heb het lang geleden ooit eens gemaakt met veel hulp en weet nu niet meer juist hoe eraan te beginnen.

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

imp4ct schreef op donderdag 02 februari 2006 @ 00:44:
En wat zou dan de juiste rege-ex zijn ?
Zoals Erkens al zegt wil je "alles" matchen: (.*)
en niet alles tot aan de eerstvolgende [: ([^\\[]*)

;)

'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!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

-NMe- schreef op donderdag 02 februari 2006 @ 01:09:
[...]

Zoals Erkens al zegt wil je "alles" matchen: (.*)
en niet alles tot aan de eerstvolgende [: ([^\\[]*)

;)
ik zou ([^\\[\/b]*) matchen

Acties:
  • 0 Henk 'm!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
-NMe- schreef op donderdag 02 februari 2006 @ 01:09:
[...]

Zoals Erkens al zegt wil je "alles" matchen: (.*)
en niet alles tot aan de eerstvolgende [: ([^\\[]*)

;)
De (.*) werkt wel, maar als je dan naar een nieuwe lijn gaat in je tekst bv.

PHP:
1
2
3
4
$newspost = "[b][i][u]
vet 
schuin 
onderlijnen[/u][/i][/b]";


werkt het dus niet meer, wat met mijn oud script wel was opgelost. Het andere voorbeeld hierboven gegeven lijkt niet te werken.

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Dat zou ik niet doen, want dan matcht dit niet: [b]blaat[/b]
Immers, er staat een b in je character class, dus daar stopt ie met matchen. Daarna wil je regexp een [ zien, maar die is er niet, dus: geen match. :)
imp4ct schreef op donderdag 02 februari 2006 @ 12:46:
De (.*) werkt wel, maar als je dan naar een nieuwe lijn gaat in je tekst bv.

PHP:
1
2
3
4
$newspost = "[b][i][u]
vet 
schuin 
onderlijnen[/u][/i][/b]";


werkt het dus niet meer, wat met mijn oud script wel was opgelost. Het andere voorbeeld hierboven gegeven lijkt niet te werken.
Zoek eens op wat de multiline modifier doet. ;)

'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!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

-NMe- schreef op donderdag 02 februari 2006 @ 13:33:
Dat zou ik niet doen, want dan matcht dit niet: [b]blaat[/b]
Immers, er staat een b in je character class, dus daar stopt ie met matchen. Daarna wil je regexp een [ zien, maar die is er niet, dus: geen match. :)
ehm, maar je wilt toch ook dat [b]bla [[[[[ bla[/b] (bla [[[[[ bla) matched, of denk ik nu verkeerd?

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 21-09 10:10

WormLord

Devver

En kijk dan ook meteen naar de ungreedy modifier, want je wil ook dat [b]dit[/b] goed [b]gaat[/b] (dit goed gaat).

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Erkens schreef op donderdag 02 februari 2006 @ 13:55:
ehm, maar je wilt toch ook dat [b]bla [[[[[ bla[/b] (bla [[[[[ bla) matched, of denk ik nu verkeerd?
Dat lijkt me inderdaad wel ja, en dat werkt toevallig ook met jouw regexp:
Maar wat als er [b]lalala[/b] staat? Je hebt nu een character class waar de l en de a niet in zitten, dus dit is geen match. ;)

'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!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
Hmm, mja heb even die "Pattern Modifiers" gelezen maar snap er dan nog niet echt iets van.
Hoe moet ik deze dan in mijn reg-ex duwen ?

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

De volgorde bij het opbouwen van een PCRE-regexp is delimeter pattern delimeter modifier(s). Dus in jouw geval:
code:
1
#\\[b\](.*)\\[/b\]#mUi

Maar dat staat allemaal ook gewoon in de documentatie (of in de linkjes daarin) en als het goed is ook in onze regexp FAQ. ;)

'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!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
-NMe- schreef op donderdag 02 februari 2006 @ 17:14:
De volgorde bij het opbouwen van een PCRE-regexp is delimeter pattern delimeter modifier(s). Dus in jouw geval:
code:
1
#\\[b\](.*)\\[/b\]#mUi

Maar dat staat allemaal ook gewoon in de documentatie (of in de linkjes daarin) en als het goed is ook in onze regexp FAQ. ;)
Sorry, maar wil niet werken als ik het in 2 lijnen zet.

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Dan kun je de dotall modifier proberen:
code:
1
#\\[b\](.*)\\[/b\]#sUi

'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!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
-NMe- schreef op donderdag 02 februari 2006 @ 17:41:
Dan kun je de dotall modifier proberen:
code:
1
#\\[b\](.*)\\[/b\]#sUi
Deze werkt !! Bedank _/-\o_

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600

Pagina: 1