[PHP-RegExp] < Binnen < > Uitsluiten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ebayzo
  • Registratie: Juli 2001
  • Laatst online: 17-10-2022
Ik ben op het moment bezig met een simpel scriptje om wat CS:Source stats weer te geven op de clanpage. De stats zijn in dit formaat:
<9> <vopi (BE)> <STEAM_0:1:5667346> <32> <30> <1> <15> <1.067>
<10> <[GoW]-Enishi-|BE|> <STEAM_0:1:5439999> <27> <38> <0> <18> <0.711>
<11> <[-SAM19i-]> <STEAM_0:1:6214608> <25> <43> <0> <12> <0.581>
<12> <Blaat|<K> <STEAM_0:1:6214608> <25> <43> <0> <12> <0.581>
<13> <[-SAM19i-]> <STEAM_0:1:6214608> <25> <43> <0> <12> <0.581>
Het is me al gelukt om via de volgende RegEXP de informatie tussen de <> uit te halen:
code:
1
preg_match_all("/\<(.+?)\>/", $statsFile[$i], $statsPreg[$i]);
Maar nu zit ik met het probleem dat hij fout gaat zodra er een < of > in de nickname zit. Ik heb mijn big ass PHP boek en GoT al uitvoerig bekeken maar kan niet vinden hoe ik dit kan oplossen.

[ Voor 24% gewijzigd door Ebayzo op 15-03-2005 21:12 ]

Default blanke hetero


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 19-09 22:18

chem

Reist de wereld rond

Je kan een exclusion doen met de ^ operator;

code:
1
([^<]+)

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 18:04
Idd zoals chem zegt kan het, maar met je huidige expressie zit je dan nog steeds met een probleem als iemand een > in zijn naam heeft (mag ook neem ik aan dan)... Je moet eigenlijk je expressie uitbreiden zodat dat ook afgevangen is. Je zou ook een split kunnen doen op "> <" (let op de spatie), maar dat gaat natuurlijk ook mis als iemand dat in zijn/haar naam heeft... Enige oplossing is een regexp schrijven die de hele boel in 1x matcht.

Dus iets als:
code:
1
/^\<([0-9]+)\>\s\<(.+)\>\s\<STEAM_0:[0-9]:[0-9]{7}\>\s\<([0-9]{2})\>\s\<([0-9]{2})\>\s\<([0-9]+)\>\s\<([0-9]+)\>\s\<([0-9\.]+)\>$/


Overigens deze expresie niet getest en de lengte van sommige dingen zijn misschien soms anders, dus dan moet je wat getalletjes aanpassen...

[ Voor 52% gewijzigd door Morrar op 15-03-2005 22:29 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Waarom niet splitten op de spatie in plaats van die <> dan is je hele probleem ook meteen opgelost, alleen de <> op het begin en eind strippen en je bent klaar :).

Acties:
  • 0 Henk 'm!

  • Ebayzo
  • Registratie: Juli 2001
  • Laatst online: 17-10-2022
PrisonerOfPain schreef op dinsdag 15 maart 2005 @ 22:38:
Waarom niet splitten op de spatie in plaats van die <> dan is je hele probleem ook meteen opgelost, alleen de <> op het begin en eind strippen en je bent klaar :).
:) Dat had ik dus in de eerste versie van het script al gedaan maar zie deze row bijvoorbeeld:
<7> <[KC] de pi .BE [VL] sucky sucky> <STEAM_0:1:3385847> <51> <42> <0> <26> <1.214>
Oeps :+ Dat zijn opeens erg veel spaties ;)
Morrar schreef op dinsdag 15 maart 2005 @ 22:21:
Idd zoals chem zegt kan het, maar met je huidige expressie zit je dan nog steeds met een probleem als iemand een > in zijn naam heeft (mag ook neem ik aan dan)... Je moet eigenlijk je expressie uitbreiden zodat dat ook afgevangen is. Je zou ook een split kunnen doen op "> <" (let op de spatie), maar dat gaat natuurlijk ook mis als iemand dat in zijn/haar naam heeft... Enige oplossing is een regexp schrijven die de hele boel in 1x matcht.

Dus iets als:
code:
1
/^\<([0-9]+)\>\s\<(.+)\>\s\<STEAM_0:[0-9]:[0-9]{7}\>\s\<([0-9]{2})\>\s\<([0-9]{2})\>\s\<([0-9]+)\>\s\<([0-9]+)\>\s\<([0-9\.]+)\>$/


Overigens deze expresie niet getest en de lengte van sommige dingen zijn misschien soms anders, dus dan moet je wat getalletjes aanpassen...
Moet eerlijk toegeven dat ik de huide regEx uit een topic hier heb gehaald. Heb dus nog niet erg veel verstand van regEx en bovenstaande reply ziet er voor mij dus nog uit als abracadabra. Maar heb hier een aardig PHP boek dus misschien dat dan het één en ander duidelijker word.

[ Voor 56% gewijzigd door Ebayzo op 15-03-2005 23:01 ]

Default blanke hetero


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

EbAyzo schreef op dinsdag 15 maart 2005 @ 22:59:
:) Dat had ik dus in de eerste versie van het script al gedaan maar zie deze row bijvoorbeeld:
[...]
Oeps :+ Dat zijn opeens erg veel spaties ;)
PHP:
1
2
3
4
5
$file = file('waarjestatsvandaan.komen');
$stats = array();
foreach ($file as $line) {
  $stats[] = explode('> <', $line);
}

Dan heb je netjes alles in één tweedimensionaal array staan, waarmee je dan kan werken. :P
Moet eerlijk toegeven dat ik de huide regEx uit een topic hier heb gehaald. Heb dus nog niet erg veel verstand van regEx en bovenstaande reply ziet er voor mij dus nog uit als abracadabra. Maar heb hier een aardig PHP boek dus misschien dat dan het één en ander duidelijker word.
Je zal in de meeste boeken niet al te gek veel vinden over reguliere expressies. Een basistoelichting misschien, maar die kun je ook op php.net wel vinden. :)

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

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 18:04
Of je kijkt even op de Perl.com website naar Perl regular expressions... Alle preg_ functies in PHP zijn hiervan afgeleid, alleen op sommige punten een beetje verkracht...

Maar zoals ik al zei: splitten op "> <" levert een probleem op als dat in de naam voorkomt, dan heb je ineens een veld extra....

Overigens kan mijn regexp denk ik wat duidelijker nog + korte toelichting:
code:
1
2
$d = '> <'; // delimiter
/^\<([0-9]+)$d(.+)$dSTEAM_0:[0-9]:[0-9]{7}$d([0-9]{2})$d([0-9]{2})$d([0-9]+)$d([0-9]+)$d([0-9\.]+)\>$/

Zoals je ziet split ik eigenlijk ook op '> <' en verder is:
^ = matcht aan begin van de string / regel
( ) = sla tussen de haken op voor latere referentie
[0-9] = karakterverzameling, in dit geval 0 t/m 9
+ = moet minimaal 1 keer voorkomen, maar mag vaker
{7} = moet precies 7x voorkomen
$ = match aan het einde van de string / regel

Hoop dat het zo wat duidelijker is...

[ Voor 52% gewijzigd door Morrar op 16-03-2005 00:31 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Morrar schreef op woensdag 16 maart 2005 @ 00:23:
Of je kijkt even op de Perl.com website naar Perl regular expressions... Alle preg_ functies in PHP zijn hiervan afgeleid, alleen op sommige punten een beetje verkracht...

Maar zoals ik al zei: splitten op "> <" levert een probleem op als dat in de naam voorkomt, dan heb je ineens een veld extra....
Datzelfde probleem zul je ook tegenkomen als je met een regexp werkt...sterker nog: juist met een regexp, want die zijn op dit gebied volgens mij net iets minder geschikt.

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

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 18:04
Nee, niet als je alle velden in de regexp opneemt, omdat er dan maar 1 mogelijke manier van matchen is. Je kunt dan de tekens van de naam in het midden laten maar de rest zo vastzetten dat het maar op 1 manier kan...

Acties:
  • 0 Henk 'm!

  • Ebayzo
  • Registratie: Juli 2001
  • Laatst online: 17-10-2022
Morrar schreef op woensdag 16 maart 2005 @ 00:23:
Of je kijkt even op de Perl.com website naar Perl regular expressions... Alle preg_ functies in PHP zijn hiervan afgeleid, alleen op sommige punten een beetje verkracht...

Maar zoals ik al zei: splitten op "> <" levert een probleem op als dat in de naam voorkomt, dan heb je ineens een veld extra....

Overigens kan mijn regexp denk ik wat duidelijker nog + korte toelichting:
code:
1
2
$d = '> <'; // delimiter
/^\<([0-9]+)$d(.+)$dSTEAM_0:[0-9]:[0-9]{7}$d([0-9]{2})$d([0-9]{2})$d([0-9]+)$d([0-9]+)$d([0-9\.]+)\>$/

Zoals je ziet split ik eigenlijk ook op '> <' en verder is:
^ = matcht aan begin van de string / regel
( ) = sla tussen de haken op voor latere referentie
[0-9] = karakterverzameling, in dit geval 0 t/m 9
+ = moet minimaal 1 keer voorkomen, maar mag vaker
{7} = moet precies 7x voorkomen
$ = match aan het einde van de string / regel

Hoop dat het zo wat duidelijker is...
Bedankt in iedergeval al voor de moeite die je hebt genomen. Maar je regexp zegt me op dit moment nog heel weinig. Ik zal me vandaag weleens een beetje gaan verdiepen erin.

Default blanke hetero


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 18:04
Graag gedaan hoor. Enne die hierboven voorgestelde explode() op '> <' zal in 99,9% van de gevallen veel handiger zijn hoor, dus die kan je prima gebruiken als de regexp niet wil lukken... Overigens zijn regexpen wel handig in sommige andere situaties, dus ondanks dat het een lastig topic is kan het nooit kwaad om je er eens in te verdiepen. :)

Acties:
  • 0 Henk 'm!

  • Ebayzo
  • Registratie: Juli 2001
  • Laatst online: 17-10-2022
Morrar schreef op woensdag 16 maart 2005 @ 13:59:
Graag gedaan hoor. Enne die hierboven voorgestelde explode() op '> <' zal in 99,9% van de gevallen veel handiger zijn hoor, dus die kan je prima gebruiken als de regexp niet wil lukken... Overigens zijn regexpen wel handig in sommige andere situaties, dus ondanks dat het een lastig topic is kan het nooit kwaad om je er eens in te verdiepen. :)
Jeetje! Nu ik jouw post lees zie ik opeens dat die explode inderdaad een goed idee is. Gisteravond zag ik het voordeel er niet van in t.o.v. de huidige manier van werken maar nu wel :P

Default blanke hetero


Acties:
  • 0 Henk 'm!

Verwijderd

Wat ik zelf wel een aardige resource vond voor regular expressions/php:

http://www.hudzilla.org/phpbook/read.php/4_8_0
Pagina: 1