DSDS - ps, Opgavesæt 5

Sidst opdateret 06-03-2008

DSDS

Opgavesæt 5: Regulære udtryk og indhentning af data fra fremmede web-sites

Opgaverne i denne uge omhandler regulære udtryk, test af form-variabler og indhentning af data fra fremmede web-sites:

Som altid skal du lægge ine besvarelser på W: drevet

Husk. forbindelse til ITU's netværk.

Ved bedømmelsen lægges der vægt på at du anvender de anviste filnavne - ellers kan vi ikke finde dine besvarelser.

Opgave A (30 procent) - Mønstre

I denne opgave skal du opskrive forskellige mønstre til brug ved simpel pattern-matching med regexp-kommandoen.

Følgende mønster genkender alle strenge bestående af nul, et eller flere tegn der enten er et a eller b eller en kombination af begge:

^[ab]*$

Bemærk at der startes med ^ og sluttes med $ således at det sikres, at mønstret skal matche hele strengen for at strengen er genkendt. Du skal også anvende ^ og $ i dine besvarelser.

Du kan checke dine mønstre med Monster servicen fra forelæsningen.

Eller en ajax version.

Gem din besvarelse i en fil ps5/monster.html i dit web-bibliotek på ITU's web-server og indsæt et link til besvarelsen fra din index-side.

Angiv mønstre for nedenstående (bemærk nedenstående er blot eksempler på hvad der skal matche, og ikke en fuldstændig liste):

  1. strenge bestående af et eller flere bogstaver.

    Følgende strenge skal genkendes: "a", "aa", "askdkdj" og "as".

    Følgende strenge skal ikke genkendes: ";", "", "asdlkfj@&/" og "232".

  2. strenge startende med et bogstav, efterfulgt af 0 eller flere bogstaver eller talcifre.

    Følgende strenge skal genkendes: "a", "dkdjs324", "akd" og "a348384akldfaslkf".

    Følgende strenge skal ikke genkendes: "1", "", ";:dkjd" og "3a".

  3. strenge startende med et bogstav, efterfulgt af 0 eller flere bogstaver, talcifre eller underscores.

    Følgende strenge skal genkendes: "a", "dkdjs324", "akd", "a348_384a", "asdf_" og "a_".

    Følgende strenge skal ikke genkendes: "1", "", ";:dkjd", "_" og "_a".

  4. navne. Et navn er en vilkårlig ikke tom sekvens af tegn bestående af bogstaver, cifre, mellemrum og tegnene: ' og -.

    Følgende strenge skal genkendes: "Hans", "Pia Petersen", "Mc'laren", "Annette Pihl-Hansen" og "42".

    Følgende strenge skal ikke genkendes: "" og "Hans P€etersen".

  5. positive heltal, dvs. ikke tomme sekvenser af cifre der (1) er et enkelt ciffer 0 eller (2) et ciffer fra 1 til 9 efterfulgt af nul, en eller flere cifre fra 0 til 9.

    Følgende strenge skal genkendes: "0", "1", "42" og "100".

    Følgende strenge skal ikke genkendes: "", "a", "01" og "43d".

  6. emails. Vi definerer en email til:

    navn@firma.land, hvor

    Bemærk, at definitionen for en email anvendt her adskiller sig fra definitionen anvendt til forelæsning 6.

    Følgende strenge skal genkendes: "n@b.com", "nd#€#@bi.££.ddk", "big.name@big.com.edu", "name@itu.dk" og "name@it.edu".

    Følgende strenge skal ikke genkendes: "n", "n@big", "n@big@bon.edu", "n@big.com@" og "to@3".

Alle delopgaver ovenfor tæller med 5 point hver.

Opgave B (20 procent) - Et bedre body-mass-index

I denne opgave skal du implementere en version af body-mass-index exemplet fra tidligere, som ydermere validerer brugerens indtastninger ved brug af regulære udtryk og betingede sætninger (if-sætninger). Brugeren skal præsenteres for brugbare fejlmeddelelser ved ikke-gyldige indtastninger - det er op til dig at afgøre hvilke indtastninger der skal være gyldige.

Gem din besvarelse i filerne bmi.html og bmi.php i underbiblioteket ps5/ til dit web-bibliotek på ITU's web-server.

Opgave C (25 procent) - Dollarkursen

Opgaven går ud på at konstruere en service som indhenter dollarkursen fra et andet web-site og benytter dollarkursen til at beregne antallet af kroner man kan købe for $100 og antallet af dollars man kan købe for kr. 100.

Servicen skal gøre brug af funktionen file_get_contents() fra forelæsningen til at hente en HTML-side ind i en php-streng (en sekvens af tegn).

Dollarkursen kan passende hentes fra valutakurser.dk. Følgende URL-adresse giver den nødvendige information i form af en HTML-side med dollarkursen sat i forhold til danske kroner:

http://www.valutakurser.dk/

Her er et udpluk af HTML-koden som ved opgavens konstruktion blev hentet med: file_get_contents("http://www.valutakurser.dk/")

<select id="fravaluta" style="FONT-SIZE: 10px; WIDTH: 155px; FONT-FAMILY: verdana" name="fravaluta">
  <option value="">Vælg valuta</option>
  <option value="100">Danske Kroner (DKK)</option>
  <option value="523,8100">Amerika (USD)</option>
  <option value="465,2900">Australien (AUD)</option>
  <option value="381,1700">Bulgarien (BGL)</option>
  <option value="527,1500">Canada (CAD)</option>
  <option value="1276,0900">Cypern (CYP)</option>
  ...
  <option value="11,6900">Filippinerne (PHP)</option>

Vi er interesseret i tallet 523,8100 i HTML-koden, hvilket betyder, at vi giver 5,23 kr. for USD 1. Her er et passende mønster, som kan bruges til at matche HTML-koden og binde det ønskede tal til en php-variabel ved brug af ereg-kommandoen:

$pattern = '([,0-9]+)">Amerika';

Din opgave er at udfylde nedenstående skabelon og gemme resultatet i filen ps5/dollarkurs.php i dit web-bibliotek på ITU's web-server:

<?php
  # Vi henter indholdet
  $html = file_get_contents(...);

  # En funktion til det kedelige
  function home_page ($title, $body) {
    echo ... 
  }

  function my_return_page ($body) {
    $now = date("Y-m-d H:i:s");
    home_page ("Dollarkursservice - $now", 
	       "<h2>Dollarkursservice</h2>
		$body");
  }

  # Vores pattern
  $pattern  = '([,0-9]+)">Amerika';

  if ( eregi (...,$dollarkurs) ) {
    # Vores pattern matcher
    $dollarkurs = (double)"$dollarkurs[1]";
    $kroner = ...;
    $dollars = ...;
    my_return_page ("For \$100.00 får du kr. ... <p>
		     For kr. 100.00 får du \$ ...");
  } else {
    # vores pattern matcher ikke
    my_return_page ("Servicen er ikke tilgængelig! <p> 
      Send mig venligst <a href=\"mailto:noget@itu.dk\">email</a>.");
  }
?>

Indsæt et link til servicen fra din index-side.

Vejledende løsning:

dollarkurs

Opgave D (25 procent) - Gør det selv

Find og beskriv tre nyttige eksempler på data det kan være interessant at hente fra et fremmed web-site. Gem beskrivelserne i en fil ps5/fetch.html i dit web-bibliotek på ITU's web-server.

Implementer (som for dollarkursservicen) et af de tre eksempler. Gem din besvarelse i en fil fetch.php i dit web-bibliotek på ITU's web-server og indsæt et link fra servicen fra filen fetch.html.

Opgave E (0 procent) - 5 hurtige

  1. Regulære udtryk kan være smarte til andet end ovenstående, øh hvad?
  2. Hvad er forskellen på ^[ab]$ og [^ab]$
  3. Matcher sekvensen asfg mønstret asd?fg Hvad med asdfg
  4. Matcher sekvensen myre mønstret ^(d|m)yre$
  5. Matcher sekvensen dyre mønstret ^([^d]|m)yre$

Martin Elsman - mael@itu.dk
Jonas Holbech - holbech@itu.dk

Valid HTML 4.01 Transitional