Avatar billede cyfer Nybegynder
21. november 2008 - 22:35 Der er 13 kommentarer og
2 løsninger

preg_match spørgsmål

Hej eksperter, nu har jeg efterhånden siddet og gloet google op og ned efter tutorials, manualer osv. uden egentlig at bliver ekstremt meget klogere.
Det er første gang jeg kaster mig ud i regular expressions og ærlig talt ved første kig virkede det virkelig ulogisk. Er dog begyndt at fatte mere af det nu, men åbenbart stadig ikke nok.

Jeg har en lang tekstfil med en masse imput af stort set samme format. Eksempel:
ABC02938 Tekst 3939 4940
ABC05234 Tekst 47 37 83 93
ABC10239 Tekst 39483948

...Således fortsætter det derned  ad..


Jeg søger så eksempeltvis efter "ABC02938" og skulle så gerne få "Tekst" og "3939 4940" tilbage i 2 forskellige arrays.


Relativ simpelt ikke? Et match der ser bort fra det søgte men på samme linje først finder array1 hvor det kun er tekst og array2 hvor det kun er tal og så leverer det tilbage til mig.


Jeg kan bare ikke hitte ud af det :((
Avatar billede cyfer Nybegynder
22. november 2008 - 02:15 #1
Sidder stadig og prøver at få det til at virke selv... Og er nået lidt ad vejen men lykkedes stadig ikke helt..

Bemærk forresten at ved "Tekst" kan der ligesom ved numrene til sidst være mellemrum.. Så fx:
ABC02938 Tekst text 3939 4940
Avatar billede Rosenkjaer Novice
22. november 2008 - 03:06 #2
<?php
$array1[1] = "ABC08486 Din Tekst 47 37 83 93";
$array2[1] = substr($array1[1], 9, strlen($array1[1]));
echo $array2[1];
?>

Den skulle gerne udskrive: Din Tekst 47 37 83 93

Men jeg har ikke lige mulighed for at teste og går i seng nu.

M.v.h. Johnny
Avatar billede cyfer Nybegynder
22. november 2008 - 12:53 #3
xylene_free >
Tak for det sene svar :) Jeg tror dog du har misforstået en lille smule eller også har jeg bare ikke forklaret mig godt nok.

Jeg har en tekst fil som indeholder flere 100 rækker med den form tekst som jeg har givet eksempel på. Jeg skal så have mulighed for at lave en søgning efter "ABC02938" som så trækker den linje ud i 2 arrays hvoraf den ene er den tekst der står efter og nr. to array er de tal som er skrevet. Dit script trækker bare hele den efterfølgende linje ud.

Jeg har som sagt selv prøvet at rode lidt og jeg er gået prep_match vejen (ved ikke om det er et dumt valg), men jeg kan sku ikke få det til at fungere.

Se her for det script jeg selv har prøvet at udarbejde og få til at virke:
http://pastebin.com/m78a4ec3
Avatar billede cyfer Nybegynder
22. november 2008 - 15:24 #4
... Ingen?

Jeg ved godt at min script er helt forkert. Det er ligeså meget for at vise jer hvad jeg mener og hvor langt jeg selv er nået :)
Avatar billede tzr Nybegynder
22. november 2008 - 15:39 #5
ok, så vi kan sige du har 3 kolonner, den første er tre bogstaver efterfulgt af 5 tal, uden mellemrum. Efter det er der noget tilfældig tekst, og derefter 8 tal der måske har mellemrum, yes ?

I så fald, off the top of my head, prøv noget i den her stil:
/^([a-zA-Z]{3}[0-9]{5})[\s]*([/w]+)[\s]*([\d\s]{8,12})$/

Har ikke testet det, men det er en start :)
Avatar billede cyfer Nybegynder
22. november 2008 - 15:46 #6
Jeg vil lige prøve.. Men hvad der ville være bedre var hvis den blot kigge efter hvad der var af tekst efter den søgning jeg laver da de tal godt kan være længere og der kan også være + foran (det er telefonnumre som også kan være udenlandske længere numre).

Og igen.. Jeg ved lige nøjagtig hvad den første kolonde indeholder (det er det som jeg skal søge efter og funktionen så skal finde og så kaste de to andre kolonder pænt tilbage til mig)
Avatar billede tzr Nybegynder
22. november 2008 - 16:05 #7
er det data du selv indsamler ?
Du løber nemlig ind i et problem med space-separated values ting når dataen selv kan indeholde mellemrum, og ikke omsluttet af fx "
Avatar billede cyfer Nybegynder
22. november 2008 - 16:08 #8
Ja det er data jeg exporterer til en txt fil. Det kommer til at se ud som beskrevet (med de linjeskift der):

ABC02938 Tekst 3939 4940
ABC05234 Tekst 47 37 83 93
ABC10239 Tekst 39483948


Jeg har prøvet at tilpasse dit pattern så jeg tror det passer men det laver unknown modifier M
"/^ABC02938[\s]*([/w]+)[\s]*([\d\s])$/"
ABC02938 Tekst text 3939 4940
Avatar billede cyfer Nybegynder
22. november 2008 - 16:23 #9
Og ja jeg har godt bemærket i det utallige forsøg jeg har testet at der ved mellemrum.. Men det jeg jo så tænkte var at det måtte være muligt at få den til at skelne mellem tekst og tal fx. Da det vil være i det format hvergang.. Altså noget tekst i array1 og nogle tal i array2
Avatar billede cyfer Nybegynder
22. november 2008 - 16:25 #10
Og den behøver jo sådan set ikke lede efter de tal der.. Så længe den trækker hele linjen ud med teksten så kan den jo bare putte resten i array nummer 2 som ikke er tekst.
Avatar billede tzr Nybegynder
22. november 2008 - 17:04 #11
Hvis det er data du selv eksporterer vil jeg foreslå at bruge et anderledes format end det du har nu, hvis det er muligt
Avatar billede cyfer Nybegynder
22. november 2008 - 17:30 #12
Det er desværre ikke muligt at det bliver eksporteret på andre måder.

Men jeg forstår dog ikke hvorfor det skulle være et problem. Måske fordi jeg ikke rigtig forstår mig så meget på regex endnu. Men det drejer sig jo om at den finder den linje man søger efter og så kun kigger på den (burde vel ikke være umuligt at få den til kun at kigge på den linje når nu den er placeret på sin egen linje).
Derefter skal den jo blot kigge efter det resterende tekst i linje og putte den ind i et array for derefter at tage resten (numrene).

Er det fuldstændig umuligt/for omfattende???
Avatar billede cyfer Nybegynder
22. november 2008 - 22:46 #13
tzr smid et svar for forsøget.. det var i hvertfald noget af vejen.
Jeg er igang med at få hjælp på phpfreaks og vi er faktisk nået 90% af vejen nu.
Avatar billede tzr Nybegynder
26. november 2008 - 17:10 #14
Ok det var godt. Jeg er nemlig heller ikke selv ekspert i regex eller noget ... hvis du har en meget klar definition af hvordan dine data er formateret, kan man højest sandsynlig lave noget regex der bare virker :)

Det skal dog lige noteres at i det regex jeg skrev, betyder ^ starten af din string, og $ slutningen, så du skal tage hver linie for sig og smide igennem preg.

Kan du ikke give et link til det indlæg du har lavet på phpfreaks ?
Avatar billede cyfer Nybegynder
27. november 2008 - 23:25 #15
Hehe det er okay. Da du skrev at jeg næsten var nød til at bruge et andet eksporteret format blev jeg stædig. Min logik sagde mig at det ikke kunne passe :)

Anyways. Her er tråden som jeg oprettede og som resultat deraf er jeg blevet en haj til regex nu. Eller jeg fatter det i hvertfald nu og kan lave mine egne funktioner :)

http://www.phpfreaks.com/forums/index.php/topic,226681.html
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