|
| 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
| |
|
|