Avatar billede olinuxo Nybegynder
13. januar 2014 - 22:57 Der er 9 kommentarer og
1 løsning

Hjælp til preg_match

Jeg har en en tekst fil, der er bygget op sådan:


-->

Oprettet: 20-10-2013
Indtil: 20-10-2014

Ejer
Navn: Ejers navn
Adresse: Ejers adresse

Lejer
Navn: Lejers navn
Adresse: Lejers navn

<--

Tekstfilen er hentet ind i en string.

Jeg kan finde "oprettet" sådan:  preg_match("/oprettet:(.*)/i", $content, $matches);

Hvordan kan jeg finde ejers navn/adresse og lejers navn/adresse?
Avatar billede moddi100 Seniormester
13. januar 2014 - 23:25 #1
Følgende er utestet, men princippet er at der matches linje for linje. Alle linjer med et kolon hives så ud.

<?php
preg_match_all("/^([a-zA-Z]+): (.*?)$/", $content, $matches);
print_r($matches);
?>
Avatar billede olinuxo Nybegynder
13. januar 2014 - 23:31 #2
Tak for interessant svar.

Jeg mangler dog at kunne skelne mellem ejer og lejer.. Hvordan sætter man disse ind i matchen, så man kun får hvad man spørger efter?
Avatar billede repox Seniormester
14. januar 2014 - 00:04 #3
Er formatet altid ens?

Er --> og <-- adskillere?
Avatar billede moddi100 Seniormester
14. januar 2014 - 00:25 #4
Hvis ejer altid står foran lejer er det jo simpelt, men ellers skal du udbygge det lidt. Behandler vi således alle linjer, er det hurtigere at anvende almindelig string-manipulation fremfor regex:

<?php

$content = "Oprettet: 20-10-2013
Indtil: 20-10-2014

Ejer
Navn: Ejers navn
Adresse: Ejers adresse

Lejer
Navn: Lejers navn
Adresse: Lejers adresse

Oprettet: 20-10-2013
Indtil: 20-10-2014

Ejer
Navn: Ejers navn
Adresse: Ejers adresse

Lejer
Navn: Lejers navn
Adresse: Lejers adresse";

// Opdel alle linjer
$lines = explode("\n", $content);

// Definer variabler
$index = -1;
$ejer = NULL;
$out = array();

// Gennemloeb alle linjer
for($n = 0; $n < count($lines); $n++)
{
    // Fjern tomme linjer
    if(trim($lines[$n]) == NULL)
        continue;
   
    // Find linjer med et kolon
    if(strpos($lines[$n], ":") !== false)
    {
        // F.eks. $key = Oprettet, $value = 20-10-2013
        list($key, $value) = explode(":", $lines[$n], 2);
       
        // Vi tilfoejer ejer/lejer foran adressen eller navnet
        // baseret paa hvilken af de to vi sidst stoedte paa
        if($key == "Navn" || $key == "Adresse"){
            $out[$index][$ejer . $key] = trim($value);
        } else {
            if($key == "Oprettet") // Lav nyt saet af info
                $index++;
           
            // Tilfoej vaerdi til oversigt
            $out[$index][$key] = trim($value);
        }
    } else {    // Kommer kun hertil ved "ejer" og "lejer"
        if(trim($lines[$n]) == 'Ejer')
            $ejer = "Ejers ";
        else
            $ejer = "Lejers ";
    }
}

echo "<pre>";
print_r($out);
echo "</pre>";

}

?>
Avatar billede repox Seniormester
14. januar 2014 - 00:58 #5
Hvis formatet altid er det samme, virker den løsning lidt kringlet (i min optik).

Man kan - relativt let - få lagt dataene i nogle variabler der er til at arbejde med.

F.eks.:

<?php

$string = "Oprettet: 20-10-2013
Indtil: 20-10-2014

Ejer
Navn: Ejers navn
Adresse: Ejers adresse

Lejer
Navn: Lejers navn
Adresse: Lejers navn";

$lines = explode("\n", $string);
array_walk($lines, function(&$item, $key) {
    $item = trim($item);
});

$from = DateTime::createFromFormat("d-m-Y", substr($lines[0], 10));
$to = DateTime::createFromFormat("d-m-Y", substr($lines[1], 8));

$owner['name'] = substr($lines[4], 6);
$owner['address'] = substr($lines[5], 9);
$tenant['name'] = substr($lines[8], 6);
$tenant['address'] = substr($lines[9], 9);


Her er indeholdt udlejningsdatoerne samt ejer og udlejer oplysningerne.

Samtidig vil man hurtigt kunne udvide funktionaliteten til at indeholde adskillere.
Avatar billede arne_v Ekspert
14. januar 2014 - 02:13 #6
preg_match_all('/Oprettet:\s*([^\r\n]*)\r?\n.*?Ejer.*?Navn:\s*([^\r\n]*)\r?\n.*?Adresse:\s*([^\r\n]*)\r?\n.*?Lejer.*?Navn:\s*([^\r\n]*)\r?\n.*?Adresse:\s*([^\r\n]*)((\r?\n)|$)/is', $content, $matches);
Avatar billede arne_v Ekspert
14. januar 2014 - 02:13 #7
Demo:


<?php
$content = 'Oprettet: 20-10-2013
Indtil: 20-10-2014

Ejer
Navn: x x
Adresse: y y 123

Lejer
Navn: z z
Adresse: w w 456

Oprettet: 20-10-2013
Indtil: 20-10-2014

Ejer
Navn: a a
Adresse: b b 123

Lejer
Navn: c c
Adresse: d d 456';

preg_match_all('/Oprettet:\s*([^\r\n]*)\r?\n.*?Ejer.*?Navn:\s*([^\r\n]*)\r?\n.*?Adresse:\s*([^\r\n]*)\r?\n.*?Lejer.*?Navn:\s*([^\r\n]*)\r?\n.*?Adresse:\s*([^\r\n]*)((\r?\n)|$)/is', $content, $matches);
for($i = 0; $i < count($matches[0]); $i++) {
    echo 'Oprettet - ' . $matches[1][$i] . "\r\n";
    echo 'Ejer - ' . $matches[2][$i] . ', ' . $matches[3][$i] . "\r\n";
    echo 'Lejer - ' . $matches[4][$i] . ', ' . $matches[5][$i] . "\r\n";
}

?>
Avatar billede olinuxo Nybegynder
20. januar 2014 - 21:20 #8
Løsningen som Arne kom med, blev brugt. Tak for hjælpen Arne. Lægger du svar?
Avatar billede arne_v Ekspert
20. januar 2014 - 21:28 #9
svar
Avatar billede olinuxo Nybegynder
08. februar 2014 - 16:47 #10
Tak for hjælpen :-)
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