[PHP/Regexp] preg_match_all probleem bij veel matched

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Topicstarter
Hey allen,

Ik ben nu al een middagje zoet met het oplossen van een vervelend probleem en ik kom er echt maar niet achter wat het is. Maar zoals jullie waarschijnlijk wel herkennen ligt het vast aan iets heel simpels, maar zie ik dat niet omdat ik er al te lang naar kijk...

Ik ben bezig met een BBCode parser en gebruik daarvoor een regular expression om allereerst de mogelijke tags uit de string te halen. Dit is de volgende expressie (met aanroep):

PHP:
1
preg_match_all('#\[(.+?)=?(.*?)\](.+?)\[/\1\]#s', $string, $matches)


Wat dit zou moeten doen is alles matchen in de vorm van "[tag]tekst[/tag]", met optioneel nog parameters voor tag, dus bijvoorbeeld "[tag param1=20]tekst[/tag]".

Ik gebruik dus preg_match_all om de var $matches te vullen met mogelijke tags. So far so good, en die data kan ik perfect gebruiken in de parser.

Echter, er zijn gevallen waarbij de parser gewoon stopt, en na wat zoekwerk heb ik een specifiek voorbeeld gevonden waarvan ik hoop dat jullie daar wat aan hebben. Het parsen van de volgende tekst gaat perfect:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[table]
  [tr]
    [th]Test[/th]
    [th]Test2[/th]
  [/tr]
  [tr]
    [td]Content2[/td]
    [td]Content3
     Bla[/td]
  [/tr]
  [tr]
    [td]Content5[/td]
    [td]Content6
     Bla[/td]
  [/tr]
  [tr]
    [td]Conten7[/td]
    [td]Content8
     Bla[/td]
  [/tr]
[/table]

[table]
  [tr]
    [th]Test11[/th]
    [th]Test12[/th]
  [/tr]
  [tr]
    [td]Content13[/td]
    [td]Content14
     Bla[/td]
  [/tr]
  [tr]
    [td]Content15[/td]
    [td]Content16
     Bla[/td]
  [/tr]
  [tr]
    [td]Content17[/td]
    [td]Content18
     Bla[/td]
  [/tr]
[/table]


Echter, wanneer ik bij beide tables nog een row toevoeg gaat het is... Dus ik pas de string aan naar:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[table]
  [tr]
    [th]Test[/th]
    [th]Test2[/th]
  [/tr]
  [tr]
    [td]Content2[/td]
    [td]Content3
     Bla[/td]
  [/tr]
  [tr]
    [td]Content5[/td]
    [td]Content6
     Bla[/td]
  [/tr]
  [tr]
    [td]Conten7[/td]
    [td]Content8
     Bla[/td]
  [/tr]
  [tr]
    [td]Conten7[/td]
    [td]Content8
     Bla[/td]
  [/tr]
[/table]

[table]
  [tr]
    [th]Test11[/th]
    [th]Test12[/th]
  [/tr]
  [tr]
    [td]Content13[/td]
    [td]Content14
     Bla[/td]
  [/tr]
  [tr]
    [td]Content15[/td]
    [td]Content16
     Bla[/td]
  [/tr]
  [tr]
    [td]Content17[/td]
    [td]Content18
     Bla[/td]
  [/tr]
  [tr]
    [td]Conten7[/td]
    [td]Content8
     Bla[/td]
  [/tr]
[/table]


Wanneer ik dit door bovenstaande expressie heenhaal zijn er ineens geen resultaten! Iemand enig idee?

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Ik heb wel een idee: gebruik een stack-based parser voor dit soort doeleinden. Er is zat te lezen over waarom ;)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Topicstarter
Dat geloof ik graag, maar ik ben toch wel zeer benieuwd waarom het bovenstaande gebeurt. Is dit bijvoorbeeld een limitatie van de match-lengte o.i.d., of zie ik iets heel simpels over het hoofd?

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
En waarom gebruik je niet de built-in BBCode parser?
Kan brak zijn, ik heb er geen ervaring mee
Ram0n schreef op vrijdag 04 september 2009 @ 17:23:
Is dit bijvoorbeeld een limitatie van de match-lengte o.i.d., of zie ik iets heel simpels over het hoofd?
Ik denk dat er een limiet zit op de recursiviteit van de regex. Dat voorkomt oneindige loops.

[ Voor 49% gewijzigd door gertvdijk op 04-09-2009 17:37 ]

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Topicstarter
Bedankt voor je antwoord, het zal iets dergelijks zijn ja.

Echt built-in is die parser niet, hij moet apart geïnstalleerd worden en ik dacht van de week dat dat niet ging lukken bij m'n host, maar ik zie nu dat ik gewoon de source kan downloaden. Daar ga ik mee spelen, bedankt!

Overigens, mocht er nog iemand de specifieke reden weten waarom het niet werkt, ik hoor het alsnog graag. Ben toch wel benieuwd...

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
Gewoon even verdiepen in het installeren van PEAR packages. :) Anders je hoster even vriendelijk vragen om 'netjes' (shared) een pear package te installeren (pear install HTML_BBCodeParser).
De BBcode parser is wel heel goed volgens zijn description:
This is a parser to replace UBB style tags with their html equivalents.
It does not simply do some regex calls, but is complete stack based parse engine. This ensures that all tags are properly nested, if not, extra tags are added to maintain the nesting. This parser should only produce xhtml 1.0 compliant code. All tags are validated and so are all their attributes. It should be easy to extend this parser with your own tags.
Tip voor volgende dergelijke vraagstukken: bij dit soort vraagstukken/problemen moet je jezelf altijd afvragen of niet meer mensen dit willen en niet al hebben gemaakt voor je. :) Zo ga je niet elke keer het wiel opnieuw uitvinden. PEAR is een goed voorbeeld hiervan en het bespaart je gewoon enorm veel tijd en de kwaliteit gaat er zeker op vooruit. Denk maar aan een 'simpele' e-mailadres validator tegenover een volledige RFC822 implementatie in PEAR die gewoon voor je klaarligt. :)

[ Voor 36% gewijzigd door gertvdijk op 04-09-2009 17:49 ]

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Topicstarter
Daar heb ik helaas zelf de rechten niet toe bij m'n host, maar ik heb ze vraag even doorgespeeld. Bedankt voor je reactie in ieder geval :)

Eigenaar/brouwer Milky Road Brewery

Pagina: 1