[php] reguliere expressie 'generiek' krijgen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • sturkel
  • Registratie: Oktober 2001
  • Laatst online: 19-09 12:28
Ik ben bezig met een parser in php met behulp van reguliere expressies.
Deze werkt naar behoren, maar ik zit nog met een probleem.
Dit is een string die 'geparsed' moet worden:
code:
1
<dtbinfo>veld1=waarde1:veld2=waarde2:veld3=waarde3</dtbinfo>

met behulp van volgende code zetten wij dit om naar een array:
code:
1
2
3
4
5
6
7
8
$regexp = "/\<dtbinfo\>(.*)\=(.*)\:(.*)\=(.*)\:(.*)\=(.*)\<\/dtbinfo\>/i";
preg_match_all ($regexp, $file, $matches);
$array = Array();
for($a=1;$a<count($matches);$a++)
{
    $array[trim($matches[$a][0])] = trim($matches[$a+1][0]);
    $a++;
}

nu wil ik dit zodanig generiek hebben dat ik bv identifiers met waarden kan toevoegen, maar ook kan weglaten bv:
code:
1
2
<dtbinfo>veld1=waarde1:veld2=waarde2:veld3=waarde3:veld4=waarde4</dtbinfo>
<dtbinfo>veld1=waarde1</dtbinfo>

Op welke manier kan ik de reguliere expressie veranderen zodat bovenstaande mogelijk is.

[AMD 64 X2 3800] [Asus a8n-e] [2048mb Kingston] [nvidia 7300GS] [2*Seagate160GB s-ata] [WD 120GB 8MB] [Plextor px-708a] [nec 4550]


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Waarom zo moeilijk?

Zoek eerst alles tussen <dtbinfo> explode dat op de dubbelepunt, en explode deze array steeds weer op het = teken.

Acties:
  • 0 Henk 'm!

Verwijderd

Je kan de aanduiding van veld+waarde ook weer laten herhalen. Je zoekt op
(v=w:)(n maal) + (v=w)

code:
1
$regexp = "/\<dtbinfo\>(.*)\=(.*)\:(.*)\=(.*)\:(.*)\=(.*)\<\/dtbinfo\>/i";

==>
code:
1
$regexp = "/\<dtbinfo\((.*)\=(.*)\:)[+]((.*)\=(.*))\<\/dtbinfo\>/i";


ik hoop dat mn haakjes goedstaan, ik heb dit niet getest ;) .

Acties:
  • 0 Henk 'm!

  • sturkel
  • Registratie: Oktober 2001
  • Laatst online: 19-09 12:28
ik heb het nu met een explode opgelost. misschien iets minder netjes, maar het werkt.
bedankt.

[AMD 64 X2 3800] [Asus a8n-e] [2048mb Kingston] [nvidia 7300GS] [2*Seagate160GB s-ata] [WD 120GB 8MB] [Plextor px-708a] [nec 4550]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
PHP:
1
$regexp = "/<dtbinfo>([^=]*)=([^:]*)(:([^=]*)=([^:]*))*<\/dtbinfo>/i";

Zoiets had je evt nog kunne gebruiken.