Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][JavaScript]Wyrażenie Regularne
Forum PHP.pl > Forum > Przedszkole
kuba_pilach
Witam, a więc tak... czytałem trochę o wyrażeniu regularnym w javascript... i mam formularz, w którym wpisuję oceny po przecinku i w następnym pliku przetwarzam i dodaję oceny do bazy danych... to działa, ale wyrażenie regularne miałoby sprawdzać, czy nie użytkownik nie wpisuje sobie: 6+.7-,2,9+ (2 może ale chodzi o ciąg...)...
Podejrzewać tylko mogę, że pojawi się jakaś zmienna lub coś, ale dokładnie nie wiem co ;]
Więc jak to zrobić?
Dzięki z góry...

Bardzo proszę o zainteresowanie się tym tematem! Pilne!
askone
Pokaż co już sam zrobiłeś, jakie próby podejmowałeś i co nie działa...
Pawel_W
skoro nie znasz dobrze wyrażeń regularnych to może prościej byłoby Ci rozbić ciąg do tablicy używając jako separatora przecinka (funkcja split), a następnie sprawdzić każdą wartość pod kątem poprawności (czy jest oceną)
kuba_pilach
Właśnie koniecznie chcę w java script: walidacja formularzy/wyrażenie regularne
Oto co próbowałem:
  1. <?php
  2.  
  3. ?>
  4. <script language="JavaScript">
  5. <!--
  6. var oceny;
  7.  
  8. function spr_oceny()
  9. {
  10. if (form-oceny.oceny.value.indexOf('1',0) == -1 ||
  11. form-oceny.oceny.value.indexOf('2',0) == -1 ||
  12. form-oceny.oceny.value.indexOf('+',0) == -1) ||
  13. form-oceny.oceny.value.indexOf('6+',0) == 1)
  14. alert("Źle wprowadziłeś oceny!");
  15. }
  16. // -->
  17. </script>
  18. <?php
  19. // do??czenie plików funkcji tej aplikacji
  20. require_once('funkcje_wyswietl.php');
  21. // pocz?tek wywietlania HTML
  22. $urldwa = "index.php";
  23. tworz_naglowek_html('Dodawanie nowej/nowych ocen(y)');
  24. if (isset($_SESSION['login'])) { // dost?p dla zalogowanego u?ytkownika
  25.  
  26. $connection = mysql_connect('localhost', 'kuba', 'ku2010ba')
  27. or die('Brak polaczenia z serwerem MySQL');
  28. $db = mysql_select_db('dzienniczek', $connection)
  29. or die('Nie moge polaczyc sie z baza danych');
  30. ?>
  31. <hr>
  32. <form name="form-oceny" action="noweoceny.php" method="post" onsubmit="spr_oceny()>
  33. <div>
  34. <?php
  35. $zapytanie = mysql_query ("SELECT * FROM Przedmiot ORDER BY ID ASC")
  36. or die('B??d zapytania: '.mysql_error());
  37.  
  38. echo '<select name="wybranyprzedmiot">';
  39.  
  40. echo '<option value="">Wybierz przedmiot</option>';
  41.  
  42. while($option = mysql_fetch_assoc($zapytanie)) {
  43.  
  44. echo '<option value="'.$option['NAZWA'].'">'.$option['NAZWA'].'</option>';
  45.  
  46. }
  47.  
  48. echo '</select>';
  49. ?>
  50. </div>
  51. <div>
  52. Oceny:
  53. <input type="text" name="oceny" size="20" />
  54. <div>
  55. Data:
  56. <input type="date" name="data" size="20" value="<?php echo date("Y-m-d"); ?>" >
  57. </div>
  58. <input type="submit" value="Dodaj" />
  59. </form>
  60. <?php
  61. mysql_close($connection);
  62. wyswietl_menu_uzyt();
  63. tworz_stopke_html();
  64.  
  65. } else {
  66. ?>
  67. <script type="text/javascript">
  68. window.location.href='<?=$urldwa?>';
  69. </script>
  70. <?php
  71. }
  72. ?>


Błąd nie wyskakuje i o to chodzi... Ma wyskakiwać błąd, że źle wprowadziłem oceny
Ale tu próbowałem w ten brzydszy sposób...
Jeśli ktoś wie, jak zrobić natychmiastowy... niech pisze na 2223312
Valdi_B
Proponuję taką receptę:
1. Zrób split "po przecinkach", uzyskując tablicę ocen.
2. Każdą z nich sprawdź wyrażeniem regułowym.

Jak rozumiem - dozwolone oceny to:
2, 2+, 3-, 3, 3+, ... 5, 5+, 6-, 6.

Co do wyrażeń regułowych w JS - zajrzyj na stronę
http://www.w3schools.com/js/js_obj_regexp.asp
Z grubsza w połowie tej strony jest opis funkcji test(), a trochę poniżej klawisz "Test it yourself".

Na stronie "Test it yourself" poeksperymentowałem z wyrażeniami regułowymi i wymyśliłem coś takiego:

var patt1=new RegExp("^2[\+]?$|^[3-5][+-]?$|^6[\-]?$");
document.write(patt1.test("6+"));


Za "6+" w funkcji "test" wstaw inne wartości, prawidłowe i błędne (na stronie "Test it yourself").

Jak widać we wzorcu:
- wariant 1 - to "2" z opcjonalnym plusem (2[\+]?),
- wariant 2 - ocena od 3 do 5 z opcjonalnym plusem lub minusem,
- wariant 3 - ocena od 6 z opcjonalnym minusem.

Znaki ^ i $ to początek i koniec string'u.

Oczywiście, w powyższym kodzie "document.write" jest tylko na potrzeby eksperymentu.
Ty musisz kolejne oceny:
- sprawdzić tym wzorcem,
- jeżeli dla którejś oceny składowej funkcja "test" da wynik false - to nie znalazłeś "pokrycia" żadnym z trzech wariantów, więc testowana ocena jest "nielegalna".

Co do składni wyrażeń regułowych - dobry opis jest choćby w dokumentacji PHP:
http://pl.php.net/manual/en/reference.pcre...tern.syntax.php
Oczywiście "wyższe bajery" są w PCRE, ale podstawy obowiązują i wJS.

A co do Twojego kodu (spr_oceny):
1. Jeżeli funkcja uruchomiona w ramach onsubmit chce ten submit zablokować, to powinna zwrócić false. U Ciebie tego nie ma.
2. Czy czasem w każdym z 4 warunków składowych zamiast "==" nie powinno być "!="?
Przecież to znalezienie któregoś z tych wariantów oznacza błąd.
kuba_pilach
A mam pytanko... jak pozwolić na ","? Próbowałem dać, ale cały czas wyskakuje false ...

A mam pytanko... jak pozwolić na ","? Próbowałem dać, ale cały czas wyskakuje false ...
A i dlaczego dla przykładu "4" wyskakuje false questionmark.gif?
Valdi_B
1. Wejdź na stronę http://www.w3schools.com/js/tryit.asp?file...yjs_regexp_test
(test it yourself)

2. Do lewego okna, jako treść w JS (2 środkowe wiersze) wprowadź:
var patt1=new RegExp("^2[\+]?$|^[3-5][+-]?$|^6[\-]?$");
document.write(patt1.test("4"));
Jak widzisz:
- w 1-szej instrukcji jest "moje" wyrażenie regułowe,
- w 2-gim wierszu jest sama czwórka.

3. Kliknij klawisz "Edit and Click Me" (nad lewym oknem).

4. W prawym oknie (wyniku) pokaże się "true".

Tak więc nie rozumiem Twojego wpisu, że "wychodzi false".

Co do "dozwolenia przecinków" - skoro robisz split "po przecinkach", to:
- przecinki są separatorami,
- w wynikowej tablicy masz segmenty tekstu "od przecinka do przecinka".
Tak więc przecinki:
- będą w polu w formularzu,
- po splicie (w elementach tablicy) - w ogóle ich nie będzie.

Być może wpisujący tekst wpisze jeszcze spacje, więc z każdej wartości w tablicy:
- najpierw usuń pocz. / końcowe spacje (trim),
- dopiero potem sprawdzaj wyrażeniem regułowym.
kuba_pilach
Aha... czyli mogę to zrobić tak:
przebiegam po każdej ocenie poprzez foreach przecinki wywalam poprzez emplode i co dalej?
Bo nie wiem, czy zrobić: jeżeli ocena nie równa się wyrażenie regularne to przerywa i cośtam robi...
czy jakoś inaczej? Proszę, weś napisz kawałek kodu w pliku php dla podpowiedzi ;]
Valdi_B
Poniżej kompletny przykład obróbki ocen i w JS i w PHP.
JavaScript nie ma "własnej" funkcji trim, więc trzeba ją zaprogramować samemu.
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  3. "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl">
  5. <head>
  6. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  7. <title>Oceny</title>
  8. <script type="text/javascript">
  9. // <![CDATA[
  10. function trim(str) {
  11. return str.replace(/^\s+/, '').replace(/\s+$/, '');
  12. } // trim
  13.  
  14. function Sprawdz() { // sprawdź oceny
  15. // Czy podano ucznia?
  16. var tt = trim(document.getElementsByName("ucz")[0].value);
  17. if (tt.length == 0) { // pole puste lub same spacje
  18. alert("Podaj dane ucznia");
  19. document.getElementsByName("ucz")[0].focus();
  20. return false;
  21. }
  22. // Czy podano oceny?
  23. tt = trim(document.getElementsByName("oc")[0].value);
  24. if (tt.length == 0) { // pole puste lub same spacje
  25. alert("Podaj oceny");
  26. document.getElementsByName("oc")[0].focus();
  27. return false;
  28. }
  29. var tbl = tt.split(","); // podziel oceny na "fragmenty"
  30. // wyrażenie regułowe
  31. var patt = new RegExp("^2[\+]?$|^[3-5][+-]?$|^6[\-]?$");
  32. var l_oc = 0; // licznik ocen
  33. // pętla przetw. ocen
  34. for (n in tbl) {
  35. var el = trim(tbl[n]); // kolejna ocena z tablicy
  36. l_oc++; // zliczaj oceny
  37. if (!patt.test(el)) { // nie pasuje do wzorca
  38. alert("Błędna ocena nr " + l_oc + ": " + el);
  39. document.getElementsByName("oc")[0].focus();
  40. return false; // blokuj submit
  41. }
  42. }
  43. return true; // OK
  44. } // Sprawdz
  45. // ]]>
  46. </script>
  47. </head>
  48.  
  49. <body>
  50. <?php
  51. // Jak wywołano stronę
  52. $rqm = $_SERVER['REQUEST_METHOD'];
  53.  
  54. if ($rqm == 'POST') {
  55. // Czytaj dane z formularza
  56. $ucz = $_POST['ucz']; // uczeń
  57. $oc = $_POST['oc']; // oceny (wszystkie)
  58.  
  59. $t_oc = split(',', $oc); // tablica ocen
  60. // Treść do wydruku
  61. $tt = 'Uczeń: ' . $ucz . '. Oceny: ';
  62.  
  63. foreach ($t_oc as $el) { // pętla przetw. ocen
  64. $oc1 = trim($el); // pojedyncza ocena (bez ew. spacji)
  65. $tt .= $oc1 . ' / '; // dopisz ocenę do string'u
  66. }
  67. echo $tt; // wydrukuj
  68. }
  69. ?>
  70. <h2>Oceny</h2>
  71. <form method="post" name="frm1"
  72. action="<?php echo $_SERVER['PHP_SELF']; ?>"
  73. onsubmit="return Sprawdz();" ><table>
  74. <tr><td>Uczeń :</td>
  75. <td><input type="text" size="15" name="ucz"
  76. value="<?php echo $ucz; ?>" /></td></tr>
  77. <tr><td>Oceny:</td>
  78. <td><input type="text" size="20" name="oc"
  79. value="<?php echo $oc; ?>" /></td></tr>
  80. <tr><td>&nbsp;</td>
  81. <td><input type="submit" value="Zapisz" /></td></tr>
  82. </table></form>
  83. </body>
  84. </html>
Oczywiście - fragment dot. "skonsumowania" ocen musisz przerobić wg swoich potrzeb.
kuba_pilach
No, i takich właśnie ludzi lubię! Chętnych do pomocy!
Oprócz tego, że nie dałeś do wyrażenia 1,1+,2- to wszystko ok...
No i ucznia skasowałem bo niepotrzebny był...
Daję , że pomogłeś
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.