Avatar billede haolan Nybegynder
28. juni 2006 - 00:48 Der er 9 kommentarer og
1 løsning

Opdeling i et array

Hey eksperter..

Jeg har noget jeg gerne vil kunne kopiere ind i et textarea, som ved afsendelse indsættes i min MySQL adskilt.

Jeg kender naturligvis explode, som en god løsning, men problemet opstår i at der i den tekst jeg kopiere ind ikke altid er det samme antal seperatorer.

Et eksempel er:

748 94975 online Haolan(Ga.Le) (høvding) 8 395 53.681  + -

her kan det ses at de forskellige ting står sepereret med mellemrum.

Dette vil jeg gerne have lagt ind i en database med strukturen:

Placering int (748)
ID int (94975)
ture int (395)
værdi tinytext (53.681)

det i parantes er, som i måske har regnet ud det der skal indsættes i databasen, når jeg indsætter den viste linie.

De andre ting kan altså udelades.. Men problemet er at linien også nemt kan se sådan ud:

991 120160 Skift navn 26  0 279 35.402  + - smid ud!

Hvor der her altså også er mellemrum i navnet, der står ikke online ud for ID-nummeret og der står ikke høvding i parantes ud for navnet.

Hvordan får jeg det fikset?
Avatar billede haolan Nybegynder
28. juni 2006 - 00:51 #1
det skal måske lige siges at navnet i sidste eksempel er sammensat "skift navn 26"
Avatar billede morhan Novice
28. juni 2006 - 09:54 #2
$str = <<< _TXT_
748 94975 online Haolan(Ga.Le) (høvding) 8 395 53.681  + -
991 120160 Skift navn 26  0 279 35.402  + - smid ud!
_TXT_;

$pattern = '/^(\d+) (\d+) .*? (\d+) ([\d.]+)  \+/m';


if(preg_match_all($pattern, $str, $matches, PREG_SET_ORDER)){
    foreach($matches as $match){

        $a = $match[1];
        $b = $match[2];
        $c = $match[3];
        $d = $match[4];

        echo "Placering=$a ID=$b ture=$c værdi=$d<br>";
    }

}
Avatar billede haolan Nybegynder
28. juni 2006 - 14:03 #3
Kan du evt. uddybe hvad det er du gør :)
Avatar billede haolan Nybegynder
28. juni 2006 - 14:27 #4
der er lige et problem i det..
Den trækker det fint ud med din metode der..

Men hvis jeg tager en samlet liste vil den ikke rigtig udskrive.

En samlet liste kan se sådan ud:

$str = <<< _TXT_
770 94975 online Haolan(Ga.Le) (høvding) 8 395 53.681  + -   
465 46458 Brave  2 404 86.841  + - smid ud! 
488 114359 online slodesons(Ga.Le)  0 482 83.650  + - smid ud! 
545 115057 killer madsen  0 455 76.319  + - smid ud! 
616 120153 HellRaider(Ga.le)  0 385 68.735  + - smid ud! 
663 120160 Skift navn 26  0 374 64.247  + - smid ud! 
992 120186 Niller  0 330 35.561  + - smid ud! 
1108 119895 Dyrne  0 387 29.379  + - smid ud! 
1114 120195 nikcolas  0 221 29.160  + - smid ud! 
1190 119896 Thrasd  0 151 25.268  + - smid ud! 
1238 119197 KlanW  0 388 23.266  + - smid ud! 
1247 120135 earclan  0 247 22.869  + - smid ud! 
1285 101616 DB den skøre  0 300 21.066  + - smid ud! 
1309 120361 Sutherland  0 56 20.129  + - smid ud! 
1463 120258 Skift navn 22  0 60 15.549  + - smid ud! 
1498 120333 neglern  0 60 14.653  + - smid ud! 
1502 * 120339 Bethoven  0 35 14.542  + - smid ud! 
1547 120312 Danina  0 60 13.774  + - smid ud! 
1568 * 120140 Tyhoon  0 23 13.512  + - smid ud! 
1649 * 120313 Vildere Ninjas  0 4 11.643  + - smid ud! 
1665 * 120168 Skift navn 28  0 14 11.364  + - smid ud! 
1711 * 101486 Høgh  0 0 10.800  + - smid ud!
_TXT_;
Avatar billede haolan Nybegynder
28. juni 2006 - 14:53 #5
ahh jeg fandt selv fejlen :) men du må stadig gerne forklare $pattern = '/^(\d+) (\d+) .*? (\d+) ([\d.]+)  \+/m';  er ikke helt med på hvad det egentlig gør.. :)
Avatar billede morhan Novice
28. juni 2006 - 15:20 #6
det er et regulært udtryk, det er en helt videnskab i sig selv (google :-)

men i grove træk

$pattern = '/^(\d+) (\d+) .*? (\d+) ([\d.]+)  \+/m';

^ start søgning fra begyndelsen af en linie (pga af /m til sidst i udtrykket)
\d+ finder et eller flere tal
.*? et ukendt antal karakterer
[\d.]+ find karakterer som er tal eller punktum

d.v.s.

1. find første nummer
2. <mellemrum>
3. find næste nummer
4. <mellemrum><hop over et ukendt antal karakterer><mellemrum>
5. find tredje nummer
6. find sidste nummer
7. \+ gør, at numrene i punkt 5 og 5 skal befinde sig foran et plus-tegn

parenteserne bruges til at fange det som står inden i. Første parentes svarer til $match[1] - placering

forvirret?

:)
Avatar billede morhan Novice
28. juni 2006 - 15:35 #7
Avatar billede haolan Nybegynder
28. juni 2006 - 16:38 #8
oki.. det hjalp lidt på forståelsen :)

Læg svar for points :)
Avatar billede haolan Nybegynder
08. september 2006 - 16:59 #9
lægger du svar? :)
Avatar billede haolan Nybegynder
16. maj 2007 - 08:27 #10
hmm jeg lukker så..
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