|  | 		    
					
        
         
          
         
	
          | |  | Noget regex Fra : Lasse Hedegaard
 | 
 Dato :  14-04-03 00:13
 | 
 |  | 
 
            Heps!
 Hvordan trækker jeg dataene 'xyz' og æøå ud af følgende:
 ABC
 DEF
 GHI
 JKLxyzMNOæøåPQR
 STU
 Mønstret er altid det samme, pånær xyz og æøå - som altså skal trækkes
 ud.
 Venligst,
 Lasse Hedegaard
 -- 
http://www.simlock.dk/ - låsesmeden til din mobiltelefon!
            
             |  |  | 
  Peter Brodersen (14-04-2003) 
 
	
          | |  | Kommentar Fra : Peter Brodersen
 | 
 Dato :  14-04-03 00:45
 | 
 |  | On Mon, 14 Apr 2003 01:13:26 +0200, Lasse Hedegaard <laxxe@nospam.dk>
 wrote:
 
 >Hvordan trækker jeg dataene 'xyz' og æøå ud af følgende:
 
 Jeg ville bruge preg_match_all():
 
 <?php
 $data = 'ABC
 DEF
 GHI
 JKLxyzMNOæøåPQR
 STU';
 preg_match_all('/[a-zæøå]+/',$data,$regs);
 $list = $regs[0];
 ?>
 
 $list er nu et array, hvor første værdi er "xyz" og anden værdi er
 "æøå".
 
 --
 - Peter Brodersen
 
 
 |  |  | 
  Lasse Hedegaard (14-04-2003) 
 
	
          | |  | Kommentar Fra : Lasse Hedegaard
 | 
 Dato :  14-04-03 00:54
 | 
 |  | 
 
            Peter Brodersen skrev:
 >$list er nu et array, hvor første værdi er "xyz" og anden værdi er
 >"æøå".
 Det var måske dumt af mig at skrive værdierne med små bogstaver - det
 var blot for at gøre det tydligere.
 Dataene kunne sagtens se sådan ud:
 ABC
 DEF
 GHI
 JKLXYZMNOÆØÅPQR
 STU
 Venligst,
 Lasse Hedegaard
 -- 
http://www.simlock.dk/ - låsesmeden til din mobiltelefon!
            
             |  |  | 
   Peter Brodersen (14-04-2003) 
 
	
          | |  | Kommentar Fra : Peter Brodersen
 | 
 Dato :  14-04-03 01:10
 | 
 |  | On Mon, 14 Apr 2003 01:54:23 +0200, Lasse Hedegaard <laxxe@nospam.dk>
 wrote:
 
 >Dataene kunne sagtens se sådan ud:
 >
 >ABC
 >DEF
 >GHI
 >JKLXYZMNOÆØÅPQR
 >STU
 
 Altså... reglen er at hive ikke-fortløbende tegn ud i sæt?
 
 Jeg er lidt træt, så jeg kan ikke gennemskue den overordnede plan, men
 for det ret aktuelle tilfælde kan det fx være:
 
 <?php
 $data = 'ABC
 DEF
 GHI
 JKLXYZMNOÆØÅPQR
 STU';
 
 // fjern ikke-tilladte tegn - denne kan snildt udvides
 $data = preg_replace('/[^A-ZÆØÅ]/','',$data);
 
 // forvent første tegn og sæt værdier
 $expect = $data[0];
 $buffer = '';
 $capture = FALSE;
 $list = array();
 
 for ($i=0;$i<strlen($data);$i++) {
 // Er tegnet ikke hvad, vi forventer, så gå
 // i capture-mode, tilføj tegnet til bufferen
 // og ryk videre til næste tegn
 if ($data[$i] != $expect) {
 $capture = TRUE;
 $buffer .= $data[$i];
 continue;
 }
 // Er vi i capture-mode og er tegnet hvad vi forventer,
 // så gem bufferen som en string i arrayet, og gå ud
 // af capture-mode
 if ($data[$i] == $expect && $capture == TRUE) {
 $list[] = $buffer;
 $buffer = '';
 $capture = FALSE;
 }
 // vi er ude af capture-mode; forvent næste tegn i rækken
 // (virker kun fra A-Z, a-z eller 0-9)
 $expect = chr(ord($data[$i])+1);
 }
 
 print_r($list);
 ?>
 
 Bemærk, at det ikke virker, hvis ÆØÅ indgår som en del af sekvensen.
 Derimod kan den sagtens finde ÆØÅ og meget andet som irregulære
 sekvenser.
 
 Det er dog ikke klart om de irregulære sekvenser skal være fortløbende
 i sig selv - altså som ABCDEYPFGHIJ skal fange 'YP' eller hhv. 'Y' og
 'P'. Det er heller ikke klart hvor meget, en sekvens dækker over -
 eller om det gør noget, at blanktegn i første omgang strippes.
 
 --
 - Peter Brodersen
 
 
 |  |  | 
  Lasse Hedegaard (14-04-2003) 
 
	
          | |  | Kommentar Fra : Lasse Hedegaard
 | 
 Dato :  14-04-03 00:59
 | 
 |  | 
 
            De data jeg skal trække ud er tal.
 Eksempel:
 ABCDE12345DEFGH67890IJKLMN
 Begge tal er på 5 cifre.
 ereg('([0-9]{5})', $buffer, $output);
 $output[1] giver 12345, men $output[2] giver ikke 67890 som jeg havde
 forventet (det er sjældent jeg piller ved regex, og er stadig rookie).
 Venligst,
 Lasse Hedegaard
 -- 
http://www.simlock.dk/ - låsesmeden til din mobiltelefon!
            
             |  |  | 
  Peter Brodersen (14-04-2003) 
 
	
          | |  | Kommentar Fra : Peter Brodersen
 | 
 Dato :  14-04-03 01:11
 | 
 |  | On Mon, 14 Apr 2003 01:58:48 +0200, Lasse Hedegaard <laxxe@nospam.dk>
 wrote:
 
 >De data jeg skal trække ud er tal.
 >
 >Eksempel:
 >
 >ABCDE12345DEFGH67890IJKLMN
 
 Hvis det altid er så simpelt, så tilbage til preg_match_all :)
 
 <?php
 $data = 'ABCDE12345DEFGH67890IJKLMN';
 preg_match_all('/\d{5}/',$data,$regs);
 $list = $regs[0];
 ?>
 
 --
 - Peter Brodersen
 
 
 |  |  | 
   Lasse Hedegaard (14-04-2003) 
 
	
          | |  | Kommentar Fra : Lasse Hedegaard
 | 
 Dato :  14-04-03 01:22
 | 
 |  | 
 
            Peter Brodersen skrev:
 >Hvis det altid er så simpelt, så tilbage til preg_match_all :)
 Jeg takker for hjælpen, omend løsningen blev en smule anderledes.
 Jeg skal prøve at lade være med at forvirre en anden gang, mht. til
 det der skal klippes væk ;)
 Venligst,
 Lasse Hedegaard
 -- 
http://www.simlock.dk/ - låsesmeden til din mobiltelefon!
            
             |  |  | 
  Peter Brodersen (14-04-2003) 
 
	
          | |  | Kommentar Fra : Peter Brodersen
 | 
 Dato :  14-04-03 01:29
 | 
 |  | On Mon, 14 Apr 2003 01:58:48 +0200, Lasse Hedegaard <laxxe@nospam.dk>
 wrote:
 
 >ereg('([0-9]{5})', $buffer, $output);
 >
 >$output[1] giver 12345, men $output[2] giver ikke 67890 som jeg havde
 >forventet (det er sjældent jeg piller ved regex, og er stadig rookie).
 
 ... og lige en forklaring til ovenstående:
 
 $output[1] rummer indholdet af det første parentes-sæt *i udtrykket*.
 $output[2] rummer indholdet af det andet parentes-sæt *i udtrykket*.
 etc.
 
 Da du kun har et sæt parenteser, har du kun ét resultat. Løsningen er
 enten at køre flere iterationer, hvilket ikke er lige tilgængeligt med
 ereg(), hvorfor preg_match_all() er handy.
 
 Du vil i øvrigt nok lægge mærke til at jeg ikke bruger parenteser i
 mine eksempler. Årsagen er, at hele den matchende string alligevel
 ryger ind som $output[0].
 
 I perl kan man i højere grad iterere sig igennem i while-løkken:
 
 $_ = 'ABCDE12345DEFGH67890IJKLMN';
 while (/\d{5}/g) {
 print $&,"\n";
 }
 
 Ovenstående er dog ikke specielt optimalt i forhold til den ønskede
 aktuelle proces, men mest blot et eksempel på at have et regulært
 udtryk i en løkke. For den aktuelle situation kan følgende fx bruges i
 perl:
 
 $_ = 'ABCDE12345DEFGH67890IJKLMN';
 my @list = /\d{5}/g;
 
 (hvilket sikkert kan skrives mere kompakt :)
 
 --
 - Peter Brodersen
 
 
 |  |  | 
   Peter Brodersen (14-04-2003) 
 
	
          | |  | Kommentar Fra : Peter Brodersen
 | 
 Dato :  14-04-03 01:30
 | 
 |  | On Mon, 14 Apr 2003 02:29:01 +0200, Peter Brodersen <usenet@ter.dk>
 wrote:
 
 >Ovenstående er dog ikke specielt optimalt i forhold til den ønskede
 >aktuelle proces,
 
 Det var vist noget vrøvl. Jeg mente, "i forhold til dit ønskede
 resultat".
 --
 - Peter Brodersen
 
 
 |  |  | 
 |  |