Avatar billede mjense173 Nybegynder
30. oktober 2004 - 12:46 Der er 12 kommentarer og
1 løsning

preg_match substr

Hvordan matcher jeg alle forekomster af denne type streng:

&33&&Werder Bremen&Hamburger SV& 1.55& 3.45& 4.70&

altså:

&(et heltal)&&(tekst og tal)&(tekst og tal)&(heltal.heltal)& (heltal.heltal)& (heltal.heltal)&

Ved hjælp af PHP funktionen: preg_match?
Avatar billede coderdk Praktikant
30. oktober 2004 - 14:46 #1
Noget i den stil:

$txt = "&33&&Werder Bremen&Hamburger SV& 1.55& 3.45& 4.70&";
preg_match_all( "/&(\d+)&&(([\d a-z]+)&){2}( (\d+\.\d+)&){3}/i", $txt, $matches );
echo "<pre>";var_dump( $matches );echo "</pre>";
Avatar billede mjense173 Nybegynder
30. oktober 2004 - 15:14 #2
Nej, det er ikke helt det jeg var ude efter.

Det kan være jeg har formuleret mig for dårligt.
Men det var ellers et fint regulært udtryk.

Jeg prøver lige igen.
Avatar billede mjense173 Nybegynder
30. oktober 2004 - 15:20 #3
Se på denne fil:
http://www.daimi.au.dk/~fotex/diverse/odds.txt

Den indeholder 5 linjer hvor de sidste 4, indeholder det som skal matches.

Jeg har derfor brug for at følgende bliver returneret, når man laver var_dump():

----------

array(128) {
  [0]=>
  array(1) {
    [0]=>
    string(38) "&01&&Ahlen&Karlsruhe& 1.80& 3.10& 3.70"
  }
  [1]=>
  array(1) {
    [0]=>
    string(44) "&02&&Greuther Fürth&FC Køln& 2.20& 2.90& 2.85"
  }
  [2]=>
  array(1) {
    [0]=>
    string(44) "&03&&Unterhaching&Frankfurt& 2.20& 2.90& 2.85"
  }
........ osv..
}
Avatar billede coderdk Praktikant
30. oktober 2004 - 15:35 #4
Sådan?

    $txt = "
&33&&Werder Bremen&Hamburger SV& 1.55& 3.45& 4.70
&01&&Ahlen&Karlsruhe& 1.80& 3.10& 3.70
&02&&Greuther Fürth&FC Køln& 2.20& 2.90& 2.85";
    preg_match_all( "/(&\d+&&.+?&.+?& \d+\.\d+& \d+\.\d+& \d+\.\d+)/i", $txt, $matches );
    echo "<pre>"; var_dump( $matches ); echo "</pre>";
Avatar billede coderdk Praktikant
30. oktober 2004 - 15:39 #5
Denne passer vist bedre:

    preg_match_all( "/(&\d+&&.+?&.+?&\s?\d+[\.,]\d+&\s?\d+[\.,]\d+&\s?\d+[\.,]\d+)/i", $txt, $matches );
Avatar billede mjense173 Nybegynder
30. oktober 2004 - 15:49 #6
Ja, den virker som den skal. (næsten)

Der er bare en lille ting, som sikker er nem at rette.

Når tallet kommer op over 99 ændrer den syntaks:

&01&&Ahlen&Karlsruhe& 1.80& 3.10& 3.70
...
&99&&Deportivo La Corun&Albacete& 1.35& 3.80& 6.80
&100&Espanyol&Villarreal& 1.90& 3.10& 3.35
  ^-- (Her er & erstattet med 0)

Men det er vel ikke svært at rette?

Smid lige et svar, så du kan få point.
Avatar billede coderdk Praktikant
30. oktober 2004 - 15:51 #7
Værsgo :)

    preg_match_all( "/(&\d{2}[&\d]&.+?&.+?&\s?\d+[\.,]\d+&\s?\d+[\.,]\d+&\s?\d+[\.,]\d+)/i", $txt, $matches );
Avatar billede mjense173 Nybegynder
30. oktober 2004 - 15:56 #8
Hov, så lige et særtilfælde mere:

&08&&Esbjerg-Nordsjælla&under/over 5,5 & 2.00&& 1.55

Her mangler det midterste odds, altså 1 X 2, hvor X mangler.
Det var vidst det hele.

Jeg siger tusinde tak for din hjælp, og dit meget hutige svar.
Avatar billede mjense173 Nybegynder
30. oktober 2004 - 15:59 #9
Har du tid til lige at løse det sidste lille problem?
Avatar billede coderdk Praktikant
30. oktober 2004 - 17:19 #10
preg_match_all( "/(&\d{2}[&\d]&.+?&.+?&\s?\d+[\.,]\d+&\s?(\d+[\.,]\d+)?&\s?\d+[\.,]\d+)/i", $txt, $matches );

Havde du andet?
Avatar billede mjense173 Nybegynder
30. oktober 2004 - 17:33 #11
Nej, ikke med det, men har du en idé om hvorfor den returnerer et array hvor der står det samme flere gange?

Ikke fordi det gør noget, men bare det undrer mig bare lidt:

array(3) {
  [0]=>
  array(128) {
    [0]=>
    string(38) "&01&&Ahlen&Karlsruhe& 1.80& 3.10& 3.70"
    [1]=>
    string(45) "&02&&Greuther Fürth&FC Køln& 2.20& 2.90& 2.85"
    [2]=>
    ...
  }
  [1]=>
  array(128) {
    [0]=>
    string(38) "&01&&Ahlen&Karlsruhe& 1.80& 3.10& 3.70"
    [1]=>
    string(45) "&02&&Greuther Fürth&FC Køln& 2.20& 2.90& 2.85"
    ...
  }
  [2]=>
  array(128) {
    [0]=>
    string(4) "3.10"
    [1]=>
    string(4) "2.90"
    [2]=>
    string(4) "2.90"
    [3]=>
    string(4) "1.40"
    ...
  }
}
Avatar billede coderdk Praktikant
30. oktober 2004 - 17:38 #12
Ja, når du ikke har parenteser er der kun ét array, er der et sæt parenteser, er der to arrays osv :) Du skal bruge nummer 1 (altså det andet array) $ditarray[1]

:)
Avatar billede mjense173 Nybegynder
30. oktober 2004 - 17:47 #13
Ok, tak for det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester