/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
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

Søg
Reklame
Statistik
Spørgsmål : 177502
Tips : 31968
Nyheder : 719565
Indlæg : 6408534
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste