190 likes | 264 Views
Databasestøttet Webpublicering, Efterår 2005 Lektion 5, Mandag 26/9 : Web-programmering med PHP Hvad er gennemgået? Værdien af validering af input fra brugere (form variable) Regulære udtryk/mønstre (expressions/patterns) PHP funktionen ereg Eksempler på validering af form-variable
E N D
Databasestøttet Webpublicering, Efterår 2005 • Lektion 5, Mandag 26/9: Web-programmering med PHP • Hvad er gennemgået? • Værdien af validering af input fra brugere (form variable) • Regulære udtryk/mønstre (expressions/patterns) • PHP funktionen ereg • Eksempler på validering af form-variable • Biblioteksfunktioner til vaidering af form-variable • Andre anvendelser af regulære udtryk • Anvend ereg til udtræk af data fra web-sider • Introduktion til øvelserne Databasestøttet Webpublicering
Gennemgået indtil nu • Variable, tal, strenge og tabeller (arrays) • Udregninger • if-konstruktioner og løkker • Funktioner og genbrug af kode • Modtagelse af brugerens data vha. forms Databasestøttet Webpublicering
Værdien af en validering af form-variable Uden en validering af bruger-input er vore Web-programmer ikke robuste! F.eks. : Currency exchange service—exchange.html <html><head><title>Exchange Bank</title></head> <body> <h2>Exchange Bank</h2> <form action="exchange.php">Enter value in kroner: <p><input type="text" name="kroner" /></p> <p><input type="submit" value="Get Dollar Amount" /></p> </form> </body></html> Filen exchange.php: <html><head><title>Exchange Bank</title></head> <body> <h2>Exchange Bank</h2> <? $kroner = $_POST[’kroner’] ; $rate = 8.43; $fee = 20.0; $dollars = ($kroner - $fee) / $rate; $dollars = number_format($dollars, 2, ",", "."); echo "For DKr. $kroner you receive \$$dollars"; ?> <p><a href="exchange.html">New Computation</a></p> </body></html>// Problem:Ingen undersøger om form-variablen kroner indeholder et tal Databasestøttet Webpublicering
Hvad kan gå galt, hvis vi ikke validerer form variablene? Forskellige slags af fejl kan optræde i den fortsatte udregning baseret på fejlagtig bruger-input: • Kosmetiske fejl: Programmet returnerer ikke-velformet HTML kode til browseren • Semantiske fejl: Programmet returnerer velformet HTML kode, som ser ud til at være korrekt – men ikke er det! • Meget grove fejl: Data slettes fra databasen fordi manglende validering kan resulterer i tilgang fra hackere Ved at validere input fra brugerne kan undgå det fleste typer fejl Databasestøttet Webpublicering
Mange slags form–variable Vi har set behovet for kunne afgøre om en form-variabel indeholder et tal. Der er mange andre typer af data vi kan bede brugerne om at indtaste: • Decimaltal (kommatal) • E-mail adresser • Tal i et bestemt interval (f.eks., postnumre) • URLadresser • Farver (red, green, blue) • Datoer • ... Vi har brug for et sprog til at beskrive strenge med et bestemt mønster Sproget vi behøver kaldes regulære udtryk regular expressions, eller mønstre patterns. Databasestøttet Webpublicering
Syntaks af regulære udtryk 1. del Et mønster m kan have forskellige former, incl.: . matcher et hvert andet tegn cmatcher tegnet c; tegnet . skrives: \. m1m2et sekventielt match af m1 og m2. F.eks.: mønsteret ‘a.c’ matcher strengen ‘abc’ m* matches af 0 eller flere sekventielle forekomster af tegnfølgen, som matcher mønsteret m. F.eks.: strengen ‘abbbbbba’ og ‘aa’ matcher mønsteret ‘ab*a’ (m) matches af strenge som matcher m. eks: Strengen ‘cababcc’ matcher mønstret ‘c(ab)*cc’ m+ matches af 1 eller flere sekventielle forekomster af tegnfølger, som matcher mønstret m. Eks: mønstret ‘ca+b’ matches af strengen ‘caaab’ men ikke strengen ‘cb’ m? matches af 0 eller 1 forekomst af tegnfølgen, som matcher mønsteret m. F.eks.: Møntret ‘abc?’ matches af både strengene ‘abc’ og ‘ab’. Databasestøttet Webpublicering
Syntax af regulære udtryk, 2. del Et mønster m kan have forskellige former, incl.: m1 | m2matches af tegnfølgen, som matcher m1 eller m2. F.eks.: mønstret ‘(hi|hello)’ matches af tegnfølgen ‘hi’ og tegnfølgen ’hello’ [. . .]matches af tegn i den specificerede klasse eller interval. F.eks.: mønsteret [abc1-4]* matches af tegnfølgen bestående af tegnene a, b, c, 1, 2, 3, 4 [ˆ. . .]matches af alle tegn som IKKE er i denne klasse eller dette interval, f.eks.: mønsteret [ˆabc1-4]* matches af tegnfølgen bestående af ethvert tegn undtagen a, b, c, 1, 2, 3, 4. Så circumflex ˆ betyder “alt andet end” tegnene som følger den. Databasestøttet Webpublicering
Eksempler på mønstre • [A-Za-zÆØÅæøå] : matches af ethvert dansk bogstav • [0-9][0-9] : matches af 2 decimale cifre (incl. Foranstillet nul [’0’] ) • (hi|hello) : matches af de 2 strenge hi og hello • ((a|b)a)* : matches af aa, ba, aaaa, baaa, . . . • (0|1)+ : matches af binære tal dvs., 0, 1, 01, 11, 011101010, . . . • .. : matches af 2 vilkårlige tegn • (red|green|blue) : matches af farverne red, green and blue • ([1-9][0-9]*)/([1-9][0-9]*) : matches af heltals kvotienter, f.eks., 1/8, 32/5645, 45/6, . . . Matcher strengen 012/54 det sidste mønster? Matcher strengen 2/0 match det sidste mønster? Databasestøttet Webpublicering
PHP funktionen ereg • Den indbyggede funktion ereg kan anvendes til at bestemme om et mønster m matches af en delstreng af en streng s. • Et kald til ereg(m,s) returnerer 1 (TRUE) hvis mønsteret m matches af en delstreng af s. Ellers returnerer den 0 (FALSE). • Hvis mønsteret m begynder med ‘^’ skal den matchende delstreng være et prefix af s, dvs., begynde ved det første tegn af s. • Tilsvarende, hvis mønsteret m afsluttes med et ‘$’ skal den matchende delstring være et suffix af s. Eksempler: Funktionskald: Resultater: ereg(’[0-9]+’ , "aa38AA") 1 ereg(’^[0-9]+’ , "aa99") 0 ereg(’^[0-9]+’ , "77AA") 1 ereg(’^[0-9]+$’ , "aa87AA") 0NotaBene: • Vi vil som hovedregel anvende ^ og $ som det første og sidste tegn i mønstret, når man validerer bruger input • Vi vil angive strengmønstre i PHP med ’...’ for at undgå den specielle betydning af $ i strenge af formen "..." Databasestøttet Webpublicering
Eksempler på brugen af PHP funktionen ereg Funktionskald Result ereg(’[a-zA-Z]+’ , "Allan Hansen") _____ ereg(’^[a-zA-Z]+$’ , "Ulla Jensen") _____ ereg(’^[a-zA-Z]+$’ , "") _____ ereg(’^[0-9][0-9]-[0-9][0-9]-[0-9]+$’ , "12-22-1969")______ ereg(’^[0-1][0-9]-[0-3][0-9]-[0-9]+$’ , "31-12-02") ______ ereg(’^(red|green|blue)$’ , "red") _______ ereg(’^(red|green|blue)$’ , "redblue") _______ ereg(’^(a|bb)*b$’ , "bbab") _______ ereg(’^(a|bb)+b*$’ , "b") _______ Databasestøttet Webpublicering
Eks. :Webprogrammet pattern.php Vi bygger en ”mønster-matcher” til at eksperimentere med mønstre--pattern.php: <html><head><title>Pattern matcher</title></head> <body><h2>Pattern matcher</h2> <? $r =$_POST[’r’]; $s =$_POST[’s’]; if ( $r != "" ) { if ( ereg("^($r)\$", $s) ) { echo "<p><b>Success:</b> The string ’$s’ matches pattern ’$r’</p>"; } else { echo "<p><b>Failure:</b> The string ’$s’ does NOT match pattern ’$r’</p>"; } } echo "<form action=’pattern.php’ method=’post’> <p>Pattern: <input type=’text’ name=’r’ value=’$r’ /></p> <p>String: <input type=’text’ name=’s’ value=’$s’ /></p> <input type=’submit’ value=’Check’ /> </form>";?> </body> </html> Note:Vi anvender funktionen ereg til at bestemme om en streng matcher et mønster Databasestøttet Webpublicering
Forbedring af valutaveksling med validering af formvariablen Vi kan forbedre vores ”vautaveksler” ved validering af bruger-input—exchange2.php: <html><head><title>Currency Exchange Service</title></head> <body> <h2>Currency Exchange Service (version 2)</h2> <? $kroner = $_POST [’kroner’]; if ( ereg(’^(0|[1-9][0-9]*)$’, $kroner) ) { $rate = 8.43; $commission = 20.0; if ( $kroner > $commission ) { $dollars = ($kroner - $commission) / $rate; $dollars = number_format($dollars, 2, ",", "."); echo "In exchange for kr. $kroner you will receive \$$dollars"; } else { echo "You cannot change an amount less than the commission!"; } } else { echo "Please go back and enter a number!"; } ?> // Spørgsmål: </body></html> //Hvordan reagerer programmet på forskellige slags bruger input? Databasestøttet Webpublicering
Funktion til at undersøge e-mail adresser Vi kan undersøge om en indtastet e-mailadresse har den forventede form ved at anvende mønsteret: [-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+@[-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+ Den følgende funktion tager en streng som argument og undersøger om strengen ser ud som en e-mailadresse: function chk_email ( $email ) { if ( ereg(’^[-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+’ . ’@[-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+$’, $email) == 0 ) { error("You must enter a valid email address"); } } // Note: Funktionen garanterer ikke, at e-mailadressen eksisterer! Vi anvender en generisk funktion error til at vise en fejlmeddelelse: function error ( $msg ) { echo "<html><body><h2>Error: $msg</h2></body></html>"; exit; // Don’t continue the script! } • Den eksakte definition af e-mailadresse kan findes i RFC2822 på www.ietf.org Databasestøttet Webpublicering
Et bibliotek af funktioner til validering af form-variable Vi kan konstruere en fil formvars.phpsom indeholder en liste af funktioner til validering af form-variable Derefter kan vi inkludere filen formvars.php(anvend include function) i scripts som læser form-variable. På denne måde bliver det let at validere form-variable. Eksempel: exchange3.php <? include ("formvars.php"); chk_integer($kroner); ?> <html><head><title>Currency Exchange Service</title></head> <body> <h2>Currency Exchange Service (version 3)</h2> <? $kroner = $_POST= [’kroner’]; $rate = 8.43; $commission = 20.0; if ( $kroner > $commission ) { $dollars = ($kroner - $commission) / $rate; $dollars = number_format($dollars, 2, ",", "."); echo "In exchange for kr. $kroner you will receive \$$dollars"; } else { echo "You cannot change an amount less than the commission!"; } ?> </body></html> Databasestøttet Webpublicering
Biblioteksfunktioner til validering af form-variable—fortsat Filen formvars.php: <? function error ( $msg ) { echo "<html><body><h2>Error: $msg</h2></body></html>"; exit; // Don’t continue the script! } function chk_email ( $email ) { if ( ereg(’^[-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+’ . ’@[-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+$’, $email) == 0 ) { error("You must enter a valid email address"); } } function chk_integer ( $number ) { if ( ereg(’^(0|[1-9][0-9]*)$’, $number) == 0 ) { error("You must enter an integer number"); } } ?> Databasestøttet Webpublicering
Andre anvendelser af regulære udtryk Regulære udtryk kan også anvendes til andre opgaver end evaluering af input fra brugere Eksempler: • Til at finde mønstre i en tekst • Søg og erstat i en tekst Hente data fra fremmede web-sites: I web-teknologi, kan regulære udtryk bruges til at finde relevant information i tekst, som downloades automatisk fra Internettet, f.eks.: • Dagens nyheder fra Reuters • Valutakurser • Aktiemarkedets kurser, indeks og bevægelser • Vejrudsigten • Pollental Databasestøttet Webpublicering
Hent data fra fremmede web-sites med PHP som værktøj Den følgende funktion kan anvendes til at ”loade” en fremmed web-site i en streng til PHP: function fetchurl ( $url ) { $fp = fopen($url, ’r’); if ( ! $fp ) return "No page"; for ($t = "" ; !feof($fp) ; ) $content .= fread($fp, 8192); fclose($fp); return $content; } ereg funktionen kan også anvendes til at udtrække information fra en hjemmeside indeholdt i en streng. Hvis man giver ereg et ekstra argument $result, delstrengen som matcher den nte del (i parentes) af mønstret, som er gemt i $result[n]. Når man kalder funktionen ereg($p,$txt,$result) er de 3 argumenter: • $p er mønstret, som skal matches teksten for at finde forekomster • $txt er teksten i hvilken en delstreng som matcher mønstret er søgt • $result er resultatet, en tabel som indeholder den tekst, som matchede, returværdi fra funktionen ereg Databasestøttet Webpublicering
Eksempel: World population- popclock.php <html><head><title>World Population Watch</title></head> <body> <h1>World Population Watch</h1> <? function fetchurl ( $url ) { $fp = fopen($url, ’r’); if ( ! $fp ) return "No page"; for ($t = "" ; !feof($fp) ; ) $content .= fread($fp, 8192); fclose($fp); return $content; } $content = fetchurl("http://www.census.gov/cgi-bin/ipc/popclockw"); ereg("<h1>([0-9,]+)</h1>",$content,$result); echo "There are at present $result[1] people in the world."; ?> </body> </html> Databasestøttet Webpublicering
Introduktion til øvelser 5 Til øvelserne skal du: • Træne i regulære udtryk. • Konstruere en forbedret version af BMI (body mass index web service). • Konstruere en dollar-valuta-vekslingstjeneste, som udtrækker kursen fra en fremmed web-site og tilbyder ombytning af kroner til dollars og omvendt. • Præsentere et brugbart automatisk udtræk af information fra en eller flere web-sites på Internettet og implementere en web-tjeneste, som udnytter denne information — vejrudsigt (rapport fra DMI), aktie markedets index, pollental, ... Databasestøttet Webpublicering