Avatar billede safl Nybegynder
19. september 2003 - 23:07 Der er 13 kommentarer og
1 løsning

Regular Expression

Hello!

Jeg har en fil med en masse linier der indeholder ting som:

serverType-movemail=Unix Movemail

Jeg skal matche det der er på begge dele af = tegnet. Jeg har prøvet med følgende udtryk men det virker ikke:
"/^[?!#]^(.*)[\s]*=[\s]*(.*)$/i"

På nogle linier er der #. Linier med # skal der ikke grabbes værdier på.

håber i kan hjælpe!

safl
Avatar billede schaefner Juniormester
19. september 2003 - 23:11 #1
Det vil sige, at det står sådan:

serverType-movemail=Unix Movemail
serverType-movemail=Unix Movemail
#serverType-movemail=Unix Movemail

og den linje med havelågen foran skal ikke med?
Avatar billede safl Nybegynder
19. september 2003 - 23:14 #2
her er et lille udpluk fra filen så er det nok nemmere at forstå:

#Translated with MozillaTranslator version 5.02
#Fri Mar 28 15:01:33 CET 2003
PreviewTitle=%S - %S
senderColumnHeader=TESTESTSETESTES
recipientSearchCriteria=Emne eller modtager indeholder\:
#SaveAttachment=Save the attached file
SaveAttachment=Gem den vedlagte fil
serverType-movemail=Unix Movemail
removeFolder=Slet mappe
Avatar billede erikjacobsen Ekspert
19. september 2003 - 23:23 #3
Noget i denne stil??

<?
  $lines = file("fil1.txt");
  foreach ($lines as $line) {
    if (ereg('^ *#',$line)) continue;
    $b=split('=',$line);
    print "$b[0] er lig med $b[1]<br>\n";
  }
?>
Avatar billede safl Nybegynder
19. september 2003 - 23:25 #4
Glemte at sige at det skal være et preg_match
Avatar billede erikjacobsen Ekspert
19. september 2003 - 23:29 #5
Det kan jeg godt se du mener.... men hvorfor?
Avatar billede safl Nybegynder
19. september 2003 - 23:31 #6
Fordi det er en del af et kæmpe script hvor den samme kode bliver brugt og afhængigt at fil-typen skiften den preg'en ud. Det er lidt smart fordi koden er nemmere at overskue jeg er desværre bare ikke så god til at skrive regulære udtryk :(
Avatar billede erikjacobsen Ekspert
19. september 2003 - 23:32 #7
okay da - hvis det skal være på den måde:

<?
  $lines = file("fil1.txt");
  foreach ($lines as $line) {
    if (preg_match('/^([^#].*?)\s*=\s*(.*)$/i',$line,$reg)) {
      print "$reg[1] er lig med $reg[2]<br>\n";
    }
  }
?>
Avatar billede safl Nybegynder
19. september 2003 - 23:42 #8
Hmm det ser jo ud til at virke :) Forstår ikke helt hvordan den får fat i værdien inden = tegnet.
Avatar billede erikjacobsen Ekspert
19. september 2003 - 23:52 #9
Det er jo problemet med disse komplicerede regulære udtryk. Læseligheden
lader noget tilbage at ønske, men de er sjove at lave.

Men prøv at fortælle mig hvad du forstår af det - så kan jeg evt supplere.

Du kan roligt undlade i-et efter den sidste skråstreg.
Avatar billede tipsen Nybegynder
19. september 2003 - 23:52 #10
Det ser ud til at du vil læse en slags konfigurationsfil - afhængig af formålet kan dette måske gøres nemmere/hurtigere...
Avatar billede safl Nybegynder
19. september 2003 - 23:58 #11
Udtrykket skal bruges i et script der oversætter filerne i Thunderbird (http://www.mozilla.org/projects/thunderbird). Så metoden er helt kanon og scriptet har virket før men af en eller anden grund så virkede det sgu ikke efter jeg skiftede server lidt underligt.

Well tilbage til forståelses spørgsmålet:
Jeg tolker det der står i den første subsearch som at der SKAL være et #. Det er det jeg ikke forstår :)
Avatar billede erikjacobsen Ekspert
20. september 2003 - 00:02 #12
Næh, [^#] betyder et hvilket som helst andet tegn end lige netop #.
Det er ^-en der li'som negerer det efterfølgende. Fx betyder [#] at det
skal være dette tegn. [abc] betyder et af tegnene a, b eller c. Mens
[^abc] betyder et hvilket som helst andet tegn.
Avatar billede safl Nybegynder
20. september 2003 - 00:08 #13
Ahh super cool! og ? udvider betydningen ikke? jeg har lige købt Oreillys Regular Expression bog kunne være jeg skulle til at læse den ;)
mange tak for svaret!
Avatar billede erikjacobsen Ekspert
20. september 2003 - 00:11 #14
.* betyder 0 til mange tegn, mens .*? betyder 0 til mange tegn, men uden
at være "grådig". Dvs den stopper tidligere op og kigger på om resten ikke
kunne passe. Ellers ville du fx få mellemrummene med før lighedstegnet (hvis
der ellers var nogen)
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