[PHP] preg_match_all nummer uit een text halen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit nu al een paar uur te stoeien met mijn regular expression, maar ik kan maar niet begrijpen waarom het resultaat afwijkt van wat ik wil

ik heb een stuk tekst:

code:
1
2
PokerStars Game #31513778276: Tournament #186459712, $10.00+$0.50 USD Hold\'em No Limit - Match Round I, Level I (10/20) - 2009/08/11 21:55:52 CET [2009/08/11 15:55:52 ET]
Table \'186459712 1\' 2-max Seat #1 is the button

Waar ik het tournament # nummer van moet hebben.

Ik gebruik hier deze regex met preg_match_all
code:
1
preg_match_all('/Tournament #(.*)[,]/', $handresult, $pregresult4, PREG_PATTERN_ORDER);


Het resultaat wat ik krijg is:
code:
1
186418144, $10.00+$0.50 USD Hold'em No Limit - Match Round I


Op een of andere manier negeert hij de 1e komma. Zie ik iets over het hoofd?

Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
.* is een greedy match (die probeert zoveel mogelijk te matchen). Die , (waarom in brackets?) komt later in de zin nog voor, dus wordt die gebruikt. Oplossing: niet-greedy matchen met (.*?) (of wat het in het lokale PHP-dialect ook moge zijn)

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:31

Creepy

Tactical Espionage Splatterer

En als de tekst toch altijd hetzelfde is: zoeken op "Tournament #" (strpos o.i.d.) en daarna de eerstvolgende komma pakken. Met substr() de tekst eruit halen en klaar ;)

[ Voor 14% gewijzigd door Creepy op 12-08-2009 16:13 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • estherdg
  • Registratie: Oktober 2006
  • Laatst online: 21-12-2021

estherdg

nubcake

'/Tournament #([0-9]*)[,]/'

zo pak je alleen nummers, is wat betrouwaarder. :)

Acties:
  • 0 Henk 'm!

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
/Tournament #([0-9]{1, 15})/

Zoiets zou het moeten doen. Je kunt er bijv. ook standaard 9 cijfers van maken:
/Tournament #([0-9]{9})/

Maar preg_* zijn relatief zware functies die veel tijd/kracht nodig hebben. Dit is wat ik zou doen:
code:
1
2
3
4
5
6
7
8
9
<?php
$str = 'PokerStars Game #31513778276: Tournament #186459712, $10.00+$0.50 USD Hold\'em No Limit - Match Round I, Level I (10/20) - 2009/08/11 21:55:52 CET [2009/08/11 15:55:52 ET]
Table \'186459712 1\' 2-max Seat #1 is the button';
$location = strstr('Tournament #', $str);
$location = substr($location, 0, 12);
$position = strpos($location, ',');
$nummer = substr($location, 0, $position);
echo $nummer;
?>

  • Cartman!
  • Registratie: April 2000
  • Niet online
Creepy schreef op woensdag 12 augustus 2009 @ 16:11:
En als de tekst toch altijd hetzelfde is: zoeken op "Tournament #" (strpos o.i.d.) en daarna de eerstvolgende komma pakken. Met substr() de tekst eruit halen en klaar ;)
Wat hij zegt. Regexes zijn niet altijd de beste oplossing :)
Pagina: 1