Centrum skryptów - Systemy operacyjne

Jak zapewnić, by użytkownicy wpisywali tylko i wyłącznie dozwolone znaki w pole tekstowe?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak zapewnić, by użytkownicy wpisywali tylko i wyłącznie dozwolone znaki w pole tekstowe?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Moja aplikacja HTA zawiera pole tekstowe, w które dany użytkownik wpisuje odpowiednie numery części, które muszą zawierać jakąś konkretną liczbę znaków. Jak ustalić, że dany użytkownik wpisał w pole tekstowe nieodpowiedni znak?

-- RR

Cześć Skrypciarze! Odpowiedź

Cześć, RR! Poza jednym wyjątkiem jeszcze nikt nigdy nie określił mnie mianem geniusza (tym wyjątkiem jest oczywiście skrypciarska Pani Redaktor, która ma w zwyczaju twierdzić, że wszystko, co robią Skrypciarze, jest idealne lub leży w niewielkiej odległości od tego ideału).

Uwaga od Redaktorki: Oczywiście nie trzeba wyjaśniać, ze nasz Skrypciarz przechodzi chyba kolejny atak złudzeniowy. Redakcja bardzo ubolewa nad tym, ze może tu ingerować jedynie w kropki i przecinki tudzież błędy gramatyczne oraz zapewnia, że choroba o nazwie ZŁUDZENIA nie jest zaraźliwa. Czytelnik powinien jednak wiedzieć, ze łączymy się z nim w szczerym bólu i polecamy pominięcie wszystkich fragmentów, które nie odnoszą się stricte do skryptu..

 

Jeżeli powyżej nasza Pani Redaktor napisała coś ironicznego lub uszczypliwego, serdecznie przepraszam. Jeśli by coś miała wstawić, to tylko i wyłącznie w to miejsce, więc ciekawe, na ile działa moja skrypciarska intuicja…

Nie czas i miejsce jednak na dyskusję z czytelnikiem, czytelnik chce zapewne tylko jednego – wyników, czyli skryptu. Proszę bardzo:

<SCRIPT LANGUAGE="VBScript">

    Sub VerifyEntry

        Set objRegEx = CreateObject("VBScript.RegExp")

        objRegEx.Global = True   

        objRegEx.Pattern = "[^ABCDEFG12345]"



        strSearchString = TextBox1.Value



        Set colMatches = objRegEx.Execute(strSearchString)  



        If colMatches.Count > 0 Then

            Msgbox "You entered an invalid character."

            TextBox1.Focus

        End If

    End Sub

</SCRIPT>



<body>

    <input type="text" name="TextBox1" size="50" onFocusOut="VerifyEntry"><p>

    <input type="text" name="TextBox2" size="50">

</body>

Po składnikach naszego kodu czas teraz na sposób przyrządzania (zapomniałem na śmierć, anegdoty kulinarne miały być w następnym skrypcie... Muszę chyba rozszerzyć zakres tematów do dygresji). Zatem: Nasza aplikacja HTA powoduje tylko wyświetlenie dwóch pól tekstowych, które wprawdzie wyglądają jednakowo, coś jednak różni je istotnie, dwie sprawy mianowicie:

  • Nazwa pół tekstowych. Pierwsze pole tekstowe (o które nam tu chodzi) ma nazwę TextBox1. Drugie ma podobnie skomplikowaną nazwę, mianowicie: TextBox2. Takie wdzięczne nazwy są właśnie kolejnym przejawem mojego geniuszu.
  • Zdarzenia dołączone do pola tekstowego. Textbox2 nie ma żadnych takich zdarzeń, czego nie można powiedzieć już o polu tekstowym Textbox1, do niego bowiem dołączone jest zdarzenie onFocusOut. Jeżeli w aplikacji HTA lub na stronie internetowej pracujemy z formantem (na przykład w trakcie wpisywania czegoś w pole tekstowe), mówimy, że formant jest aktywny. Jeżeli opuścimy ten formant (na przykład klikając gdzie indziej lub przyciskając klawisz TAB), przestaje on być aktywny. Powoduje to uruchomienie zdarzenia onFocusOut, co w naszym przypadku powoduje uruchomienie przez aplikację HTA podprogramu VerifyEntry.
Uwaga: Jeżeli nic z tego, co napisałem powyżej, nie ma dla Was większego sensu, może to oznaczać jedynie dwie rzeczy: albo mój geniusz przepadł w tej złowrogiej minucie, albo moi czytelnicy nie są zaznajomieni z aplikacją HTA. W sumie mam nadzieję, ze chodzi o to drugie (w tym wypadku zapraszam do witryny HTA Developers Center (j.ang.), gdzie wyjaśniamy wszystko, co tyczy się HTA). Intuicja podpowiada mi jednak, że niestety chodzi o to pierwsze…

 

No, chociaż skrypt jest idealny i genialny, jemu nic nie grozi. Każdy przejaw geniuszu, którego można się tutaj dopatrzyć, jest generowany przez nic innego, jak tylko podprogram VerifyEntry. Pierwszą rzeczą, jaką w nim robimy, jest utworzenie wystąpienia obiektu VBScript.RegExp. A przy okazji – jest to obiekt VBScript, umożliwiający nam wyszukiwanie wyrażeń regularnych.

Uwaga: Tym razem nie chodzi już na pewno o zanik moich mocy geniuszowych. Jeżeli nie jesteście zaznajomieni z wyszukiwaniem wyrażeń regularnych, to warto spojrzeć na nowy, świetny webcast Deana Tsaltasa: "String Theory for System Administrators" (j.ang.).

 

Po utworzeniu obiektu wyrażeń regularnych ustawiamy właściwość Global na True; dzięki temu skrypt będzie przeszukiwał całość wartości wpisanej w pole. Ogólnie rzecz biorąc nie trzeba przeszukiwać całej wartości tego skryptu. Jednak w większości przypadków będziemy chcieli to zrobić, dlatego też umieściliśmy tu dodatkowy wiersz kodu. Następnie określamy wzorzec (Pattern), którego szukamy:

objRegEx.Pattern = "[^ABCDEFG12345]"

Składnia wyrażeń regularnych wygląda zawsze dość dziwnie, żeby nie powiedzieć – głupio. Wyjaśnić więc trzeba na tym etapie jej sens. Załóżmy, że RR chce, aby do wpisywania numerów części używać tylko poniższych znaków:

  • A
  • B
  • C
  • D
  • E
  • F
  • G
  • 1
  • 2
  • 3
  • 4
  • 5

Chcąc określić interesujący nas zestaw znaków, umieszczamy je w nawiasie kwadratowym. Dajmy na to, ze poszukujemy znaków X, Y, Z. W naszej składni będzie wyglądało to w sposób następujący:

objRegEx.Pattern = "[XYZ]"

Oczywiście w naszym wypadku nie chcemy wcale poszukiwać elementów z nawiasu, chodzi nam przecież o coś odwrotnego – chcemy wyszukać wszystkie znaki oprócz tych w nawiasie. Dlaczego? Wyobraźmy sobie, ze nasz użytkownik wpisuje nazwę części AB325@. Znaków A, B, 3, 2, lub 5 nie musimy wyszukiwać, to oczywiste, że mogą być używane w nazwie części. Zamiast tego chcemy wyszukać znak @ i każdy inny nieważny znak. Dlatego też nasz wzorzec zawiera w sobie znak ^ przed zestawem znaków. Oznacza on „wyszukaj wszystko poza znakami umieszczonymi w zestawie”).

Chcemy wyszukać znaki X,Y,Z? Używamy następującej składni:

objRegEx.Pattern = "[XYZ]"

Chcemy wyszukać wszystkie znaki poza X,Y,Z? Używamy takiej składni:

objRegEx.Pattern = "[^XYZ]"

Wypróbujcie sobie ten skrypt kilka razy, a zobaczycie, jak działa.

Po zdefiniowaniu naszego wzorca należy zdefiniować wartość, którą chcemy wyszukać. Ponieważ zawiera ona się we właściwości Value w naszym polu TextBox1, używamy następującego kodu, by przypisać informacje wpisane w tym polu tekstowym do zmiennej o nazwie strSearchString:

strSearchString = TextBox1.Value

Następnie przywołujemy metodę Execute i kontynuujemy nasze wyszukiwanie:

Set colMatches = objRegEx.Execute(strSearchString)

Przypominamy, ze poszukujemy tu wszystkich znaków, które nie należą do naszego zestawu znaków. Informacja o każdym takim dopasowaniu zostaje przechowana w kolekcji Matches (nazwiemy ją tu colMatches). Jeżeli wszystkie znaki w danym ciągu są ważne, nie będziemy mieli żadnych dopasowań, zatem właściwość Count będzie równa 0. Jeżeli natrafimy jednak na jakiś nieważny znak, to zostanie on umieszczony w naszej kolekcji. Sprawdzamy to następującym wierszem kodu:

If colMatches.Count > 0 Then

Jeżeli licznik będzie wynosił więcej niż 1, oznacza to, ze znaleźliśmy chociaż jeden znak nieważny. W tym przypadku uruchamiamy następujące wiersze kodu:

Msgbox "You entered an invalid character."

TextBox1.Focus

W pierwszym wierszu wyświetlamy po prostu pole tekstowe, które stwierdza, że został wprowadzony znak nieważny znak. W drugim wierszu natomiast ponownie aktywujemy pole TextBox1. To zmusza naszego użytkownika do wpisania poprawnej nazwy części, zanim możliwe będzie dalsze wpisywanie danych.

To chyba na tyle dzisiaj, mój geniusz się wyczerpał, a i Pani Redaktor utyskuje na moje wypociny, bo wynagrodzenie jest płacone od strony (za chwilę pewnie wykasuje z pół strony moich cennych uwag, które chcę tu wpi...

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne