[PHP] preg_replace - regular expression

Pagina: 1
Acties:

Onderwerpen


  • imp4ct
  • Registratie: November 2003
  • Laatst online: 29-10 10:59
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


  • 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

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 :-) ]


  • imp4ct
  • Registratie: November 2003
  • Laatst online: 29-10 10:59
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


  • 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.


  • 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

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 29-10 10:59
-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


  • 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.


  • 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?

  • WormLord
  • Registratie: September 2003
  • Laatst online: 06-10 21:15

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).

  • 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.


  • imp4ct
  • Registratie: November 2003
  • Laatst online: 29-10 10:59
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


  • 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.


  • imp4ct
  • Registratie: November 2003
  • Laatst online: 29-10 10:59
-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


  • 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.


  • imp4ct
  • Registratie: November 2003
  • Laatst online: 29-10 10:59
-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