Avatar billede nicolailissau Nybegynder
25. september 2010 - 22:53 Der er 12 kommentarer og
1 løsning

Regex php

Hey eksperter.

Har igen brug for lidt assistance til regex.

Jeg vil gerne finde tilfælde af fx "27. sep" eller "1. okt" (uden ").

Jeg har forsøgt med: /^[0-31]{1,2}\.\s[a-z]/i

Men uden held..

Er der nogen der kan hjælpe mig? - og gerne med en lille forklaring..
Avatar billede erikjacobsen Ekspert
25. september 2010 - 23:02 #1
Noget i retning af:

  /^[0-9]{1,2}\.\s[a-z]+/i
Avatar billede nicolailissau Nybegynder
25. september 2010 - 23:28 #2
Jeg kan desværre ikke få det til at virke.. I får lige et helt eksempel:


$contents="<div class="boxdivenv boxdivenv-ugedagdatotitel">
    <div id="Ch0.S0.SS0.SSS9.p1">
      <h3>Semesteruge 5: - Store og Lille dag (27. sep - 1. okt
      2010) : Anden uge om Komplekse tal</h3>
    </div>";
$pattern="/^[0-31]{1,2}\.\s[a-z]/i";

preg_match_all($pattern,$contents,$matches);
Avatar billede nicolailissau Nybegynder
25. september 2010 - 23:29 #3
- hvor det jo så er den 27. sep jeg er ude efter. Jeg tænkte at det smarteste var at lave regex for at få den 27. sep og 1. okt ud og derefter skille 1. okt fra.

Mvh
Avatar billede erikjacobsen Ekspert
25. september 2010 - 23:33 #4
Lille fejl:

  /[0-9]{1,2}\.\s[a-z]+/i
Avatar billede coderdk Praktikant
26. september 2010 - 15:55 #5
En anden lille demo:

$contents = '
    <div class="boxdivenv boxdivenv-ugedagdatotitel">
        <div id="Ch0.S0.SS0.SSS9.p1">
            <h3>Semesteruge 5: - Store og Lille dag (27. sep - 1. okt
                2010) : Anden uge om Komplekse tal</h3>
        </div>
    </div>
    <div class="boxdivenv boxdivenv-ugedagdatotitel">
        <div id="Ch0.S0.SS0.SSS9.p1">
            <h3>En titel mere (1. nov 2010): En dag om noget andet</h3>
        </div>
    </div>
    ';
   
$pattern = '/>(.*?)\s*\((\d+)\.\s+([a-z]+)(\s*\-\s*(\d+)\.\s+([a-z]+))?(\s*(\d{4}))\)\s*:\s*(.*?)</i';

if ( preg_match_all( $pattern, $contents, $matches, PREG_SET_ORDER ) )
{
    foreach ( $matches as $m )
    {
        $moredays = !empty( $m[5] );
        $dato = ( $moredays ? 'Fra' : '' ) . " $m[3] $m[2]" . ( $moredays ? " til $m[6] $m[5]" : '' );
        echo "<div><b>Hvornår</b>: $dato</div><div><b>Titel</b>: $m[1]</div><div><b>Beskrivelse</b>: $m[9]</div><hr>";
    }
}
else
{
    echo "Ingen matches";
}
Avatar billede nicolailissau Nybegynder
27. september 2010 - 22:23 #6
Tak for svar!

Lækkert man altid kan stole på eksperten.dk!

Mit resultat blev dette (lidt en blanding af begge):

function mathTimeTable(){
    $prefix = "http://01005.mat.dtu.dk/2010/materialer/enoter/?tx_enotelms_pi1[showUid]=NUID9-IDX";
    $arr = array();
    $pattern="/[0-9]{1,2}\.\s[a-z]+/i";
    for($i=1;$i<=23;$i++) {
        $contents=file_get_contents($prefix.$i);
        preg_match_all($pattern, $contents, $matches);
        foreach ( $matches as $m ) {
            $arr[]=$m[2];
        }
    }
    return $arr;
}

print_r(mathTimeTable());
Avatar billede nicolailissau Nybegynder
27. september 2010 - 22:26 #7
ps. ligger i et svar? :)
Avatar billede nicolailissau Nybegynder
27. september 2010 - 23:53 #8
Kan jeg hurtig lige høre om et eksempel mere? :)

Jeg leder efter tilfælde på formen: "10.00 - 11.30".

Jeg har forsøgt med: /[0-9]{1,2}\.[0-9]{1,2}\s\-\s[0-9]{1,2}\.[0-9]{1,2}/i

Men uden held. Jeg tror det er "-" der driller, for hvis jeg skriver:
/[0-9]{1,2}\.[0-9]{1,2}\s.

Får jeg fx et resultat der ligner: [6] => 13.30 â
Avatar billede coderdk Praktikant
28. september 2010 - 00:15 #9
/(\d+\.\d+)\s*\-\s*(\d+\.\d+)/

eller

/(\d{1,2}\.\d{2})\s*\-\s*(\d{1,2}\.\d{2})/

Du kan også udskifte \d med [0-9] men \d sparer ;)
Avatar billede nicolailissau Nybegynder
29. september 2010 - 11:00 #10
Tak for hjælpen. Har afgivet point til coderdk, da Erik Jacobsen ikke samler på point :)
Avatar billede nicolailissau Nybegynder
29. september 2010 - 11:09 #11
Hey igen coderdk. Jeg kan ikke få det til at fungere?
Her er mit eksempel:

$prefix = "http://01005.mat.dtu.dk/2010/materialer/enoter/?tx_enotelms_pi1[showUid]=NUID9-IDX3";
$pattern="/(\d{1,2}\.\d{2})\s*\-\s*(\d{1,2}\.\d{2})/";
$contents=file_get_contents($prefix);
preg_match_all($pattern, $contents, $matches);
print_r($matches);

med resultatet: Array ( [0] => Array ( ) [1] => Array ( ) [2] => Array ( ) )

tomt :S

Tager jeg kun: /(\d{1,2}\.\d{2})\s får jeg som før ex. 10.00..
Avatar billede coderdk Praktikant
29. september 2010 - 12:20 #12
Der er noget med UTF-8 ... Bindestregen er ikke en bindestreg... Du kan finde ud af hvad det er, eller bare bruge:

$prefix = "http://01005.mat.dtu.dk/2010/materialer/enoter/?tx_enotelms_pi1[showUid]=NUID9-IDX3";
$pattern="/(\d{1,2}\.\d{2})\s*.\s*(\d{1,2}\.\d{2})/si";
$contents=utf8_decode(file_get_contents($prefix));
preg_match_all($pattern, $contents, $matches);
print_r($matches);

her har jeg brugt utf8_decode og i stedet for at matche på "-" matcher jeg bare på et hvilket som helst tegn...
Avatar billede nicolailissau Nybegynder
29. september 2010 - 22:53 #13
Jamen det er jo perfekt :)

Endnu en gang tak.
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