[php/regex] aanhalingstekens moeten kloppen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Ik ben op het moment bezig met een Stackbased Template-parser, mede voor mijn CMS-systeempje. Het werkt allemaal als een trein, maar ik zit met een probleempje. Ik ben niet zo'n regex-koning (koning in het latijn is 'rex', toeval? ;))

Het probleem is als volgt: ik heb bijvoorbeeld een string als deze:
code:
1
attr="value" blaat="woei"


Nu parse ik die met de volgende regex:
code:
1
preg_match_all("/([^\=\"]+)(\=)(\"|\')([^\"]*?)(\'|\")([ \]])/i",$string,$matches);


Dit gaat allemaal goed, dankzij de regex mag ik beginnen met zowel ' als ", en mag ik ook eindigen met ' en ". Nu wil ik graag controleren of het laatste aanhalingsteken " of ' is. Dan kan ik namelijk ook aanhalingstekens binnen de value van een attribuut gebruiken, dus zo:

code:
1
attr="blaat'woei" test='blaat"woei" blaat'


Ik heb in de PHP manual gekeken, en daar staat een hele hoop over zogenaamde 'Back references'. Daarmee kun je terugkijken naar een bepaald sup-pattern en kijken wat daar de waarde van was. Als ik in het bovenstaande regex daar gebruik van ga maken, krijg ik dus iets als volgt:

code:
1
preg_match_all("/([^\=\"]+)(\=)(\"|\')([^\"]*?)(\2)([ \]])/i",$string,$matches);


Maar dit werkt dus niet :'( Is er een regex-rex in de buurt die mij even kan vertellen hoe het wel moet? Bedankt alvast :*

Acties:
  • 0 Henk 'm!

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
\\2 of $2 ipv \2 (of ' gebruiken ipv " om je regex)

[ Voor 53% gewijzigd door marcusk op 22-11-2002 18:19 ]


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Bedankt voor je reactie, maar als ik het zo doe werkt het nog steeds niet :'(
code:
1
preg_match_all("/([^\=\"]+)(\=)(\"|\')([^\"]*?)(\\2)([ \]])/i",$string,$matches);

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Dit zal eea wel verduidelijken:
code:
1
2
3
4
5
6
7
8
/              Begin
([^\=\"]+)     \1 Match alles wat geen '=' of dubbelquote is, 1 of meer malen
(\=)           \2 Matcht '='
(\"|\')        \3 Matcht Singlequote of dubbelquote
([^\"]*?)      \4 Matcht Alles wat geen dubbelquote is, onbepert aantal malen, non greedy
(\\2)          \5 Matcht wat er bij \2 gematcht is (in dit geval weten we zeker dat dat een '=' is
([ \]])        \6 Matcht een spatie of ']'
/i             Einde, case insensitive (maar je regexp bevat niet eens letters?)

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
kvdveer bedankt :* Nu werkt het. Ik dacht dat regex met \\3 'drie plaatsen terug' bedoelde en niet de derde plek van links :) Staat erg onduidelijk op de uitlegpagina van preg op www.php.net :(