prethodna      sadržaj       slijedeća     
Vodič za core JavaScript 1.5 



Poglavlje 4   Regularni izrazi


Regularni izrazi su uzorci koji se koriste pri pretraživanju u kombinaciji stringova. U JavaScriptu, regularni izrazi su također objekti. Ovi uzorci koriste se sa exec i test metodama u RegExp i sa match, replace , search i split metodama String objekta. Ovo poglavlje objašnjava regularne izraze.

JavaScript 1.1 i ranije. Regularni izrazi nisu definirani u JavaScript 1.1 i ranije.

Ovo poglavlje sadrži:



Kreiranje regularnih izraza

Konstrukcija regularnih izraza može se izvesti na dva načina:



Pisanje uzorka regularnog izraza

Uzorak regularnog izraza sastoji se od jednostavnih znakova, kao npr. /abc/, ili kombinacije jednotavnih i specijalnih znakova, kao npr. /ab*c/ ili
/Chapter (\d+)\.\d*/ . Posljednji primjer sadrže zagrade koje služe za memoriranje. Podudarnost napravljena s ovim dijelom uzorka se pamti za kasniju upotrebu, opisano u Uporaba zagrada u substring podudaranju.


Uporaba jednostavnih uzoraka

Jednostavni uzorci sadrže znakove za koje želite pronaći direktnu podudarnost. Npr., uzorak /abc/ podudara se sa kombinacijom znakova u stringovima samo u slučaju da su znakovi 'abc' zajedno i u tom poretku. Takvu podudarnost ćete naći u stringu "Hi, do you know your abc's?" i u "The latest airplane designs evolved from slabcraft." U oba slučaja podudarnost je u 'abc'. Podudarnost ne postoji u stringu "Grab crab" jer ne sadrži podstring 'abc'.


Uporaba speijalnih znakova

Kad pretraživanje podudarnosti zahtijeva nešto više od direktne podudarnosti, kao npr. traženje jednog ili više b-ova, ili pretraživanje praznih mjesta, uzorak mora sadržavati specijalne znakove. Npr., uzorak /ab*c/ podaudara se sa bilo kakvom kombinacijom znakova u kojoj je jedno 'a' ispred nijednog ili više 'b'-ova ( * znači 0 ili više slučajeva znaka ispred) ,a odmah nakon toga mora biti znak 'c'. U stringu "cbbabbbbcdebc," uzorak se podudara sa substringom 'abbbbc'.

U narednoj tablici naći ćete potpuni popis i opis specijalnih znakova koji se mogu koristiti u regularnim izrazima.


Tablica 4.1    Specijalni znakovi u regularnim izrazima.  



znak

značenje

\

 

Jedno od slijedećih:


  • Kod znakova koji se tretiraju podatkovno, pokazuje da naredni znak je specijalni i da se neće interpretirati kao znak (slovo).

    Npr., /b/ se podudara sa znakom 'b'. Postavljanjem backslash-a ispred b, odnosno /\b/ , znak postaje specijalnim da označi podudarnost s granicom riječi.


  • Kod znakova koji se tretiraju specijalno, pokazuje da naredni znak nije specijalni i da se treba interpretirati kao znak (slovo).

    Npr., * je specijalni znak i označava 0 ili više slučajeva prethodnog znaka ; npr., /a*/ označava 0 ili više a-ova . Da bi se * prikazala kao znak, stavite ispred backslash. Npr., /a\*/ označava 'a*' , a ne 'aaa'.

 
^

 

Označava početak inputa. Ako je multiline flag postavljen na true, također znači podudarnost odmah nakon line break znaka.

Npr., /^A/ ne podudara se sa 'A' u stringu "anA", ali se podudara sa prvim 'A' u stringu "Ana".  

$

 

Označava kraj inputa. Ako je multiline flag postavljen na true, također znači podudarnost odmah nakon line break znaka.

Npr., /t$/ ne podudara se sa 't' u "eater", ali se podudara u "eat".  

*

 

Zamjenjuje prethodni znak 0 ili više puta.

Npr., /bo*/ zamjenjuje 'boooo' te nalazi podudarnost u "A ghost booooed" ili npr. zamjenjuje 'b' te nalazi podudarnost u "A bird warbled", ali ne i u "A goat grunted".  

+

 

Zamjenjuje prethodni znak jednom ili više puta. Ekvivalentno sa {1,} .

Npr., /a+/ nalazi podudaranje 'a'  sa "candy" te svih a-ova u "caaaaaaandy".  

?

 

Zamjenjuje prethodni znak nijednom ili samo jednom.

Npr., /e?le?/ nalazi podudaranje 'el' sa "angel" ili 'le' sa "angle."

Ako je napisan odmah nakon nekog kvantifikatora *, +, ?, ili {} , čineči kvantifikator sitim (nalazi podudarnost minimalni broj puta), nasuprot predefiniranom kad je kvantif. gladan (nalazi podudarnost maximalni broj puta).

Također se koristi pri pretra�ivanju �to je opisano pod x(?=y) i x(?!y) u ovoj tabeli.  

.

 

(Decimalna točka) zamjenjuje jedan znak izuzev newline (novi red) znaka.

Npr., /.n/ zamjenjuje 'an' ili 'on' te nalazi podudarnost sa "nay, an apple is on the tree", ali ne i sa 'nay'.  

(x)

 

Zamjenjuje 'x' i pamti podudarnost. Ovo su zagrade za hvatanje.

Npr., /(foo)/ nalazi podudarnost 'foo' sa "foo bar" i to pamti. Podudarni substring može se opozvati iz rezultantnog niza elemenata [1], ..., [n] .  

(?:x)

 

Nalazi podudarnost sa 'x' no to ne pamti. To su zagrade za ne-hvatanje. Podudarni substring ne može se opozvati iz rezultantnog niza elemenata [1], ..., [n] . 

x(?=y)

 

Nalazi podudarnost sa 'x' samo ako se iza 'x' nalazi 'y'. Npr. , /Jack(?=Sprat)/ nalazi podudarnost sa 'Jack' samo ako je iza 'Sprat'. / Jack(?=Sprat|Frost)/nalazi podudarnost sa 'Jack' samo ako je iza 'Sprat' ili 'Frost'. Pa ipak, niti 'Sprat' niti 'Frost' nije dio rezultata podudaranja.  

x(?!y)

 

Nalazi podudarnost sa 'x' samo ako se iza 'x' ne nalazi 'y'. Npr., /\d+(?!\.)/ nalazi podudarnost sa brojem smo ako se iza broja ne nalazi decimalna točka. Regularni izraz /\d+(?!\.)/.exec("3.141") nalazi podudarnost sa 141 ,ali ne i sa 3.141.  

x|y

 

Nalazi podudarnost ili sa 'x' ili sa 'y'.

Npr., /green|red/ nalazi podudarnost sa 'green' u "green apple" te 'red' u "red apple."  

{n}

 

Gdje je n pozitivni integer (cio broj). Zamjenjuje točno n slučajeva prethodnog znaka.

Npr., /a{2}/ ne nalazi podudarnost 'a' u "candy," ali nalazi podudarnost svih a-ova u "caandy," i prva dva a-ova "caaandy."  

{n,}

 

Gdje je n pozitivni integer (cio broj). Nalazi podudarnost sa najmanje n slučajeva prethodnog znaka. Dakle, moramo imati najmanje n znakova da bi postojala podudarnost.

Npr., /a{2,} ne nalazi podudarnos 'a' u "candy", ali nalazi podudarnost svih a-ova u "caandy" te u "caaaaaaandy."  

{n,m}

 

Gdje su n i m pozitivni integeri. Nalazi podudarnost sa najmanje n i najviše m occurrences slučajeva prethodnog znaka.

Npr., /a{1,3}/ ne nalazi podudarnost u "cndy", ali nalazi 'a' u "candy," te prva dva a-ova u "caandy," i prva tri a-ova u "caaaaaaandy". Uočite,kada se traži podudarnost u "caaaaaaandy", rezultat je "aaa", iako originalni string ima više a-ova.  

[xyz]

 

Skup znakova. Nalazi podudarnost sa bilo kojim od znakova unutar zagrada. Opseg znakova određuje se sa povlakom (-).

Npr., [abcd] je isto kao [a-d] . Određuje podudarnost 'b' u "brisket" te 'c' u "ache".  

[^xyz]

 

Negacijski tj. komplementarni skup znakova. Tj., nalazi podudarnost sa svime što nije u zagradi. Opseg znakova određuje se sa povlakom (-).

Npr., [^abc] je isto kao [^a-c] . Određuje podudarnost 'r' u "brisket" i 'h' u "chop."  

[\b]

 

Nalazi podudarnost sa backspace. (Ne miješajte sa \b.)  

\b

 

Nalazi podudarnost sa word boundary (granicom riječi), kao što je space (razmaknica) ili newline (novi red). (Ne miješajte sa [\b].)

Npr., /\bn\w/ nalazi podudarnost 'no' sa početkom  "noonday"; /\wy\b/ nalazi podudarnost 'ly' sa "possibly yesterday."  

\B

 

Nalazi podudarnost sa non-word boundary.

Npr., /\w\Bn/ nalazi podudarnost 'on' u "noonday",a /y\B\w/ nalazi podudarnost 'ye' u "possibly yesterday."  

\cX

 

Gdje je X  kontrolni znak (CTRL). Nalazi podudarnost sa kontrolnim znakom u stringu.

Npr., /\cM/ nalazi control-M u stringu (CTRL+M).  

\d

 

Nalazi podudarnost sa znamenkom. Ekvivalentno sa [0-9].

Npr., /\d/ ili /[0-9]/ nalazi podudarnost '2' u "B2 is the suite number."  

\D

 

Nalazi podudarnost sa znakom koji nije znamenka. Ekvivalentno sa [^0-9].

Npr., /\D/ ili /[^0-9]/ nalazi podudarnost 'B' u "B2 is the suite number."  

\f

 

Nalazi podudarnost sa form-feed.  

\n

 

Nalazi podudarnost sa linefeed.  

\r

 

Nalazi podudarnost sa carriage return.  

\s

 

Nalazi podudarnost sa razmakom, uključujuči space, tab, form feed, line feed. Ekvivalentno sa [ \f\n\r\t\v\u00A0\u2028\u2029].

Npr., /\s\w*/ nalazi podudarnost ' bar' u "foo bar."  

\S

 

Nalazi podudarnost sa jednim znajkom koji nije white space. Ekvivalentno sa
[ ^\f\n\r\t\v\u00A0\u2028\u2029] .

Npr., /\S\w*/ nalazi podudarnost 'foo' u "foo bar."  

\t

 

Nalazi podudarnost sa tab.  

\v

 

Nalazi podudarnost sa vertical tab.  

\w

 

Nalazi podudarnost sa bilo kojim alfanumeričkim znakom uključujuči i underscore (_). Ekvivalentno sa [A-Za-z0-9_].

Npr., /\w/ nalazi podudarnost 'a' u "apple," '5' u "$5.28," te '3' u "3D."  

\W

 

Nalazi podudarnost sa bilo kojim non-word (koji nije riječ) znakom. Ekvivalentno sa [^A-Za-z0-9_].

Npr., /\W/ ili /[^$A-Za-z0-9_]/ nalazi podudarnost '%' u "50%."  

\n

 

Gdje je n pozitivni integer. Nalazi podudarnost sa n substringova.

Npr., /apple(,)\sorange\1/ nalazi podudarnost 'apple, orange,' u "apple, orange, cherry, peach."  

\0

 

Nalazi podudarnost sa NUL znakom. Ne stavljajte iza ovog neku drugu znamenku.  

\xhh

 

Nalazi podudarnost sa znakom koji ima code hh (dvije hexadecimalne znamenke)  

\uhhhh

 

Nalazi podudarnost sa znakom koji ima code hhhh (četiri hexadecimalne znamenke).  


Upotreba zagrada

Zagrade oko bilo kojeg dijela uzorka regularnog izraza izaziva pamćenje pri nalazu podudarnosti. Jednom zapamćen, substring se može opozvati za daljnju upotrebu, kao što je opisano u Upotreba zagrada u substring podudaranju.

Npr., uzorak /Chapter (\d+)\.\d*/ predstavlja dodatne escaped i specijalne znakove i omogućava da dio uzorka bude zapamćen. Točnije, nalazi podudarnost znakova 'Chapter ' iza kojeg slijedi jedan ili više znakova ( \d označava bilo koji broj,a + znači 1 ili više puta), iza toga nalazi se decimana točka (koja je po sebi specijalni znak; stavljajući ispred dec. točke \ znači da uzorak sadrži znak '.'), a iza svega je opet neki broj 0 ili više puta ( \d označava broj, * znači 0 ili više puta). Nadalje, zagrade se koriste da zapamte prvi broj koji se podudara.

Ovaj uzorak je nađen u "Open Chapter 4.3, paragraph 6" te je '4' zapamćen. Uzorak nije nađen u "Chapter 3 and 4", jer string nema točku nakon '3'.

Da bi se našla podudarnost substringa bez zapamćivanja, unutar zagrada ispred uzorka stavite ?: . Npr., (?:\d+) nalazi podudarnost sa jednim ili više brojeva, ali to neće zapamtiti.



Rad sa regularnim izrazima



Regularni izrazi se koriste sa RegExp metodama test i exec i sa String metodama match , replace , search i split. Ove metode su detaljno objašnjene u Core JavaScript Reference.


Tablica 4.2    metode koje koriste regaularne izraze



metoda

opis

exec

 

RegExp metoda koja izvršava pretraživanje podudarnosti u stringu. Za rezultat daje niz.  

test

 

RegExp metoda koja testira podudaranje u stringu. Za rezultat daje true ili false.  

match

 

String metoda koja izvršava pretraživanje podudarnosti u stringu. Za rezultat daje niz ili null ako podudarnost ne nađe.  

search

 

String method koja testira podudaranje u stringu. Za rezultat daje index podudarnosti  ili -1 ako podudarnost se ne nađe.  

replace

 

String metoda koja izvršava pretraživanje podudarnosti u stringu te zamjenjuje string koji se podudara sa zamjenskim stringom.  

split

 

String metoda koja koristi regularni izraz ili fixni string da razbije string u niz substringova.  

Kada želite znati da li je pronađen uzorak u stringu upotrijebite test ili search metodu. Za detaljniju informaciju (ali sporije izvršavanje) upotrijebite exec ili match metode. Ako upotrijebite exec ili match i ako je podudaranje uzastopno, ove metode daju niz i osvježavaju svojstva pridružena objektima reg. izraza, a također i predifiniranih objakata regularnih izraza, RegExp. Ako podudarnost ne postoji, exec metoda daje null (koje se pretvara u false).

U narednom primjeru, skripta koristi exec metodu da bi pronašla podudarnost u stringu.

<SCRIPT LANGUAGE="JavaScript1.2">
myRe=/d(b+)d/g;
myArray = myRe.exec("cdbbdbsbz");
</SCRIPT>

Ako ne trebate pristupiti osobinama regularnog izraza, alternativni način krairanja myArray je pomoću skripte:

<SCRIPT LANGUAGE="JavaScript1.2">
myArray = /d(b+)d/g.exec("cdbbdbsbz");
</SCRIPT>

Ako želite kreirati regularni izraz iz stringa, još jedna alternativa je skripta:

<SCRIPT LANGUAGE="JavaScript1.2">
myRe= new RegExp ("d(b+)d", "g");
myArray = myRe.exec("cdbbdbsbz");
</SCRIPT>

Pomoću ovih skritpti, traženje podudarnosti je uzastopno,za rezultat daje niz, te osvježava svojstva prikazana u tablici.


Tablica 4.3    Resultati izvršavanja regularnih izraza.  



objekt

osobina ili index

opis

u ovom primjeru

myArray

 

String koji se podudara i svi zapamćeni substringovi.  

["dbbd", "bb"]  

index

 

0-ti index tražene podudarnosti u unesenom stringu.  

1  

input

 

Originalni string.  

"cdbbdbsbz"  

[0]

 

Posljednji podudarni znak.  

"dbbd"  

myRe

lastIndex

 

Index od kojeg treba početi tražiti narednu podudarnost. (Ovo svojstvo se postavlja samo ako reg. izraz koristi g opciju, opisano u Izvršavanje globalnog pretraživanja, slučaj ignoriranja i uzimanje u obzir višelinijskog inputa.)  

5  

source

 

Text uzorka.Osvježen za vrijeme kreiranja, a ne izvršavanja.  

"d(b+)d"  

Prema onom što je prikazano u drugačijem obliku ovog primjera, možete upotrijebiti regularni izraz napravljenog pomoću objekt inicijalizatora bez pridruživanja varijabli. Ukoliko to učinite onda je svaki događaj novi regularni izraz. Zato, ako koristite ovaj oblik bez pridruživanja varijabli, ne možete naknadno pristupiti svojstvima tog regularnog izraza. Npr., pretpostavimo da imate slijedeću skriptu:

<SCRIPT LANGUAGE="JavaScript1.2">
myRe=/d(b+)d/g;
myArray = myRe.exec("cdbbdbsbz");
document.writeln("The value of lastIndex is " + myRe.lastIndex);
</SCRIPT>

Ova skripta prikazuje:

Vrijednost od lastIndex je 5

No ako imate ovu skriptu:

<SCRIPT LANGUAGE="JavaScript1.2">
myArray = /d(b+)d/g.exec("cdbbdbsbz");
document.writeln("The value of lastIndex is " + /d(b+)d/g.lastIndex);
</SCRIPT>

Onda je prikazano:

Vrijednost od lastIndex je 0

Događaji od /d(b+)d/g u dvjema naredbama su različiti objekti regularnih izraza i zato imaju različite vrijednosti njihovih lastIndex svojstava. Ako trebate pristupiti svojstvima regularnih izraza kreiranih pomoću objekt inicijalizatora, morate ih prvo pridružiti varijabli.


Upotreba substringa u zagradi

Upotrebivši zagradu u uzorku reg. izraza omogućuje se da podudarnost bude zapamćena. Npr., /a(b)c/ Nalazi podudarnost sa 'abc' i pamti 'b'. Za opozivanje dobivenog rezultata, koristiti Array elemente [1], ..., [n] .

Broj mogućih substringova u zagradi je neograničen. Rezultantni niz zadrži sve podudarnosti. Pogledajte naredni primjer.

Primjer 1. Naredna skripta koristi replace (zamjeni) metodu za prebacivanje riječi u stringu. Za zamjenski text, skripta koristi $1 i $2 pri zamjeni da označi prvi string i drugi substring u zagradi koji se podudara.

<SCRIPT LANGUAGE="JavaScript1.2">
re = /(\w+)\s(\w+)/;
str = "John Smith";
newstr = str.replace(re, "$2, $1");
document.write(newstr)
</SCRIPT>

Ovo printa "Smith, John".

Primjer 2. U narednom primjeru, RegExp.input se postavlja pomću Change događaja. U getInfo funkciji,  exec metoda, pozvana koristeći () shortcut notaciju, koristi vrijednoti od RegExp.input kao svoj argument.

<HTML>

<SCRIPT LANGUAGE="JavaScript1.2">
function getInfo(){
   a = /(\w+)\s(\d+)/();
   window.alert(a[1] + ", your age is " + a[2]);
}
</SCRIPT>

Unesite vaše ime i godine i pritismite Enter.

<FORM>
<INPUT TYPE="text" NAME="NameAge" onChange="getInfo(this);">
</FORM>

</HTML>


Izvršavanje global search-a, ignoring case-a i uzimanje u obzir multiline input-a

Regularni izrazi imaju tri opcionalna flaga (indikatora stanja) koji dozvoljavaju global i case insensitive searching (globalno pretraživanje i pretraživanje bez osjetljivosti na mala i velika slova). Da naznačite global search upotrijebite g flag. Da naznačite case-insensitive search upotrijebite i flag. Da naznačite multi-line search upotrijebite m flag. Ovi flagovi mogu stajati sami ili zajedno u bilo kojem poretku te se smatraju dijelom regularnog izraza.

Pri unosu flaga u reg. izraz koristite sintaksu:

re = /pattern/flags
re = new RegExp("pattern", ["flags"])

Uočite da su flagovi integralni dijelovi reg. izraza te kasnije ne mogu biti dodani niti maknuti.

Npr., re = /\w+\s/g stvara regularni izraz koji traži jedan ili više znakova iza kojih je space (razmaknica) i pretražuje takvu kombinaciju kroz cijeli string.

<SCRIPT LANGUAGE="JavaScript1.2">
re = /\w+\s/g;
str = "fee fi fo fum";
myArray = str.match(re);
document.write(myArray);
</SCRIPT>

Ovo prikazuje ["fee ", "fi ", "fo "]. U ovom primjeru možete zamjeniti liniju:

re = /\w+\s/g;

sa:

re = new RegExp("\\w+\\s", "g");

te dobiti isti rezultat.

Flag m je upotrijebljen da omogući da višelinijski input string bude tretiran kao više linija. Ako se m flag koristi, ^ i $ nalazi podudarnost na početku ili kraju bilo koje linije unutar input stringa umjesto početka ili kraja čitavog stringa.



Primjeri



Naredni primjeri pokazuju neke upotrebe regularnih izraza.


Promjena poretka u input stringu

Naredni primjer ilustrira oblikovanje regularnog izraz te upotrebu string.split() i string.replace(). On čisti grubo formatirani input string koji sadrži imena (prvo ime prvo) odvojeno sa blanks, tabs i točno jednim semicolon (točka-zarez). Naposlijetku, onokreće poredk imena (zadnje ime prvo) te sortira popis.

<SCRIPT LANGUAGE="JavaScript1.2">

// The name string contains multiple spaces and tabs,
// and may have multiple spaces between first and last names.
names = new String ( "Harry Trump ;Fred Barney; Helen Rigby ;\
       Bill Abel ;Chris Hand ")

document.write ("---------- Original String" + "<BR>" + "<BR>");
document.write (names + "<BR>" + "<BR>");

// Prepare two regular expression patterns and array storage.
// Split the string into array elements.

// pattern: possible white space then semicolon then possible white space
pattern = /\s*;\s*/;

// Break the string into pieces separated by the pattern above and
// and store the pieces in an array called nameList
nameList = names.split (pattern);

// new pattern: one or more characters then spaces then characters.
// Use parentheses to "memorize" portions of the pattern.
// The memorized portions are referred to later.
pattern = /(\w+)\s+(\w+)/;

// New array for holding names being processed.
bySurnameList = new Array;

// Display the name array and populate the new array
// with comma-separated names, last first.
//
// The replace method removes anything matching the pattern
// and replaces it with the memorized string—second memorized portion
// followed by comma space followed by first memorized portion.
//
// The variables $1 and $2 refer to the portions
// memorized while matching the pattern.

document.write ("---------- After Split by Regular Expression" + "<BR>");
for ( i = 0; i < nameList.length; i++) {
   document.write (nameList[i] + "<BR>");
   bySurnameList[i] = nameList[i].replace (pattern, "$2, $1")
}

// Display the new array.
document.write ("---------- Names Reversed" + "<BR>");
for ( i = 0; i < bySurnameList.length; i++) {
   document.write (bySurnameList[i] + "<BR>")
}

// Sort by last name, then display the sorted array.
bySurnameList.sort();
document.write ("---------- Sorted" + "<BR>");
for ( i = 0; i < bySurnameList.length; i++) {
   document.write (bySurnameList[i] + "<BR>")
}

document.write ("---------- End" + "<BR>")

</SCRIPT>


Upotreba specijalnih znakova za provjeru inputa

U narednom primjeru, korisnik unosi telefonski broj. Kada korisnik pritisne Enter, skripta provjerava ispravnost broja. Ukoliko je broj dobar (podudara se s nizom znakova određenih reg. izrazom),skripta iznosi window zahvale i potvrđuje taj broj. Ako broj nije valjan, skripta iznosi window koji obavještava korisnika da broj ne valja.

Regularni pretražuje nijednu ili jednu otvorenu zagradu  \(?, nakon čega se nalaze 3 znamenke \d{3}, nakon čega slijedi nijedna ili jedna zatvorena zagrada \)?, nakon čega slijedi jedan dash, forward slash, ili decimal point te kada pronađe pamti znak ([-\/\.]), iza čega su tri znamenke \d{3},a nakon toga zapamćeni dash, forward slash ili decimal point \1 , iza čega su 4 znamenke \d{4}

Uf uf uf i samo uuuuf :-)) .

Change koji se aktivira kad korisnk pritisne Enter postavi vrijednost od RegExp.input .

<HTML>
<SCRIPT LANGUAGE = "JavaScript1.2">

re = /\(?\d{3}\)?([-\/\.])\d{3}\1\d{4}/;

function testInfo() {
   OK = re.exec();
   if (!OK)
      window.alert (RegExp.input +
         " isn't a phone number with area code!")
   else
      window.alert ("Thanks, your phone number is " + OK[0])
}

</SCRIPT>

Enter your phone number (with area code) and then press Enter.
<FORM>
<INPUT TYPE="text" NAME="Phone" onChange="testInfo(this);">
</FORM>

</HTML>


prethodna      sadržaj      slijedeća     
Copyright © 2000 Netscape Communications Corp. All rights reserved.

Posljednje izmjene Rujan 28, 2000