Avatar billede mccookie Seniormester
24. juli 2015 - 12:44 Der er 12 kommentarer og
2 løsninger

Reg. exp.

Hej,

Jeg har en variabel fra en database, hvori der akkumuleres en kommentartråd.

Eksempel:

2015/07/24 11:56:09 (administrator)

sdfsdf
sd
fsd
f
sd
fs
df
sdf

2015/07/24 12:56:09 (administrator)

sdfsdf
sd
fsd
f
sd
fs
df
sdf


Jeg vil gerne søge i stregen og opdele alle "bidderne" fra 2015/07/24 12:56:09 (administrator) og indtil næste bid starter og sorterer dem i datoorden......

Jeg er lidt på bar bund - Og håber at det kan lade sig gøre...
Avatar billede mccookie Seniormester
24. juli 2015 - 16:26 #1
I virkeligheden vil jeg gerne lave en explode og bruge tidsstemplerne som adskillere..... men de er kun ens i opbygningen og ikke i indholdet.

Derfor er min udfordring at lave en pattern, der matcher 4 tal / 2 tal / 2 tal mellemrum (tekst)
Avatar billede jakobdo Ekspert
24. juli 2015 - 19:41 #2
Den her vil matche dato:
\d{4}\/\d{2}\/\d{2}

Den her vil matche tid:
\d{2}:\d{2}:\d{2}
Avatar billede mccookie Seniormester
24. juli 2015 - 20:22 #3
Hej Jakob

Hmm...

$keywords = preg_split("/\d{4}\/\d{2}\/\d{2}/", $test);
print_r($keywords);

$test = "2015-10-20 2015-10-20 2015-10-20";

Result:
Array ( [0] => 2015-10-20 2015-10-20 2015-10-20 )

Havde satset på 3 forskellige array
Avatar billede tryltryl Juniormester
24. juli 2015 - 20:30 #4
Kig på formatet af datoerne...

2015/07/24 vs 2015-10-20
Avatar billede mccookie Seniormester
24. juli 2015 - 20:35 #5
Argghh, men det ændre kun lidt på resultatet ;o)

$keywords = preg_split("/\d{4}\/\d{2}\/\d{2}/", $test);
print_r($keywords);

Array ( [0] => [1] => [2] => [3] => )
Avatar billede tryltryl Juniormester
24. juli 2015 - 21:01 #6
Du skal nok have lidt ekstra på kaldet til preg_split, hvis adskilleren skal beholdes...

http://php.net/manual/en/function.preg-split.php

preg_split(a, b, -1, PREG_SPLIT_DELIM_CAPTURE);
Avatar billede tryltryl Juniormester
24. juli 2015 - 21:02 #7
Og så skal udtrykket rammes ind:

/(\d{4}\/\d{2}\/\d{2})/
Avatar billede tryltryl Juniormester
24. juli 2015 - 21:24 #8
Jeg tænker om det ikke kan gøres smartere med en anden funktion:

$re = '(\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \((.*?)\)';

if(preg_match_all("#$re(.*?)((?=$re)|\$)#s", $text, $matches, PREG_SET_ORDER))
{
    // $matches består af:
    // i+0: array(x, datotid, brugernavn, besked)
    // i+1: array(x, datotid, brugernavn, besked)
    // ...
   
    usort($matches, "cmp"); // sorter
   
    foreach($matches as $match)
    {
        echo "dato tid: ".$match[1]."<br>";
        echo "brugernavn: ".$match[2]."<br>";
        echo "besked: ".$match[3]."<br>";
        echo "<hr>";
    }
}
else
{
    echo "ingen match";
}

function cmp($a, $b)
{
    return strcmp($a[1], $b[1]); // 1=datotid
}
Avatar billede jakobdo Ekspert
24. juli 2015 - 21:51 #9
Mit problem er nok jeg ikke helt har forstået spørgsmålet. Så ved ikke hvordan en færdig løsning skulle tage sig ud
Avatar billede tryltryl Juniormester
24. juli 2015 - 22:12 #10
Jeg kan da godt prøve at fortolke lidt efter bedste evne... Han har en masse forumindlæg (består af dato+krop), som er samlet i en enkelt streng. Alle indlæg skal trækkes ud og sorteres.

:-)
Avatar billede jakobdo Ekspert
24. juli 2015 - 23:13 #11
Takker. Nu giver det mening. :)
Avatar billede mccookie Seniormester
27. juli 2015 - 11:28 #12
Tryltryl - Præcis....

.... Og det virker præcist som tænkt.....

Kan du uddybe denne sætning:
preg_match_all("#$re(.*?)((?=$re)|\$)#s", $text, $matches, PREG_SET_ORDER)

Jeg ville gerne kunne forstå løsningen og anvende det en anden gang :-)
Avatar billede mccookie Seniormester
27. juli 2015 - 11:56 #13
og tryltryl - smid et svar
Avatar billede tryltryl Juniormester
28. juli 2015 - 00:54 #14
Der sker tre ting:

1) Find start på indlæg. Det er indholdet i $re.
2) Forsæt indtil vi rammer punkt 3. Det er (.*?)
3) Søg indtil vi rammer et nyt indlæg (eller slut på streng)

Dvs.

#$re(.*?)((?=$re)|\$)#s

$re fanger hovedet med dato og brugernavn
(.*?) fanger indholdet af beskeden
(?=$re) søger indtil vi møder starten på ny besked ELLER
|$ indtil der ikke er mere tekst.

#...# angiver start/slut på udtrykket
#s betyder at punktum også matcher LF (ny linje)
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

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