Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ JavaScript _ CharAt

Napisany przez: topcio 4.02.2018, 21:16:33

Hej

Chcę sprawdzić poprawność adresu IP.
Chcę wykorzystać do tego metodę charAt, ale jak wiadomo IP może się zawierać w 1 do 3 znaków na każde pole,
czy to jest poprawnie napisane do ustawienia zmiennej, bo wydaje mi się, że nie. A jeśli nie to jak powinno to wyglądać

[JAVASCRIPT] pobierz, plaintext
  1. var delimiter = input.charAt(1) || input.charAt(2) || input.charAt(3);
[JAVASCRIPT] pobierz, plaintext


Z góry dzięki

Napisany przez: trueblue 4.02.2018, 21:29:15

http://php.net/manual/en/function.filter-var.php
http://php.net/manual/en/filter.filters.validate.php

Oj.
https://www.w3resource.com/javascript/form/ip-address-validation.php

Napisany przez: SmokAnalog 5.02.2018, 01:27:09

Cytat(topcio @ 4.02.2018, 21:16:33 ) *
Chcę sprawdzić poprawność adresu IP.
Chcę wykorzystać do tego metodę charAt

Dlaczego chcesz wykorzystać do tego metodę charAt? biggrin.gif Są lepsze sposoby.

Napisany przez: topcio 5.02.2018, 02:05:31

Zrobiłem Tak

  1. if ( $("#dvr_wan_ip_adress").parents("#dvr_register_form").length == 1 ) {
  2. if ( $('#dvr_wan_ip_adress').val().length == 0 ) {
  3. setTimeout(function() { $('#message').addClass('error');}, 500);
  4. setTimeout(function() { $('#message').attr( 'style', 'color: rgba(220,20,60,1)' );}, 500);
  5. $( '#message' ).html("Należy Podać Adres IP WAN Rejestratora !!!");
  6. $( '#dvr_wan_ip_adress' ).prop('required', true).addClass( 'error' ).attr( 'onmouseover', 'return Remove_Required()' );
  7. ValidatorID = $( '#dvr_wan_ip_adress' );
  8. return false;
  9. }
  10. if ( $('#dvr_wan_ip_adress').val().length != 0 ) {
  11. var validChars = "0123456789";
  12. var input = $( '#dvr_wan_ip_adress' ).val();
  13. var ip_address = input.length >= 7 && input.length <= 16;
  14. if(ip_address) {
  15. var dot_count = 0;
  16. for ( var i=0; i < input.length; i++ ) {
  17. if (input[i]=='.') {
  18. dot_count++;
  19. }
  20. }
  21. if (dot_count === 3) {
  22. var delimiter_1 = input.indexOf( ".", 0 );
  23. var delimiter_2 = input.indexOf( ".", delimiter_1 + 1);
  24. var delimiter_3 = input.indexOf( ".", delimiter_2 + 1);
  25. var delimiter_4 = input.length;
  26. var section_1 = delimiter_1;
  27. var section_1_length = section_1 >= 1 && section_1 <= 3;
  28. if (section_1 >= 1 && section_1 <= 3) {
  29. var section_2 = delimiter_2 - delimiter_1 - 1;
  30. if (section_2 >= 1 && section_2 <= 3) {
  31. var section_3 = delimiter_3 - delimiter_2 - 1;
  32. if (section_3 >= 1 && section_3 <= 3) {
  33. var section_4 = delimiter_4 - delimiter_3 - 1;
  34. if (section_4 >= 1 && section_4 <= 3) {
  35. var pairs = input.http://www.php.net/split(".");
  36. for ( var i=0, psl = pairs.length, pair, j; i < psl; i++ ) {
  37. pair = pairs[i];
  38. for ( j = 0; j < pair.length; j++) {
  39. if ( validChars.indexOf( pair.charAt(j) ) === -1 ) {
  40. return false;
  41. }
  42. }
  43. if ( pair > 255) {
  44. info() ;
  45. return false;
  46. }
  47. }
  48. }
  49. } else {
  50. info() ;
  51. return false;
  52. }
  53. } else {
  54. info() ;
  55. return false;
  56. }
  57. } else {
  58. info() ;
  59. return false;
  60. }
  61. } else {
  62. info() ;
  63. return false;
  64. }
  65. } else {
  66. info() ;
  67. return false;
  68. }
  69. }
  70. };
  71. function info() {
  72. setTimeout(function() { $('#message').addClass('error');}, 500);
  73. setTimeout(function() { $('#message').attr( 'style', 'color: rgba(220,20,60,1)' );}, 500);
  74. $( '#message' ).html("Adres IP ma Niepopraewną Wartość !!!");
  75. $( '#dvr_wan_ip_adress' ).prop('required', true).addClass( 'error' ).attr( 'onmouseover', 'return Remove_Required()' );
  76. ValidatorID = $( '#dvr_wan_ip_adress' );
  77. return false;
  78. };


Jak dla mnie działa, ale pewnie można coś uprościć.

Napisany przez: trueblue 5.02.2018, 08:16:12

Cytat(topcio @ 5.02.2018, 02:05:31 ) *
[...] pewnie można coś uprościć.

Czy ja wiem, wygląda naprawdę kompaktowo.

Napisany przez: topcio 5.02.2018, 11:24:18

Cieszę się, bo siedziałem nad tym pół nocy. Tamte linki co mi podałeś trochę mnie nakierowaly, ale musiałem sam coś naskrobać bo nie do końca spełniały moje oczekiwania.

Napisany przez: SmokAnalog 5.02.2018, 18:47:27

Przyszła mi ochota na kuchnię włoską.

Napisany przez: topcio 5.02.2018, 19:14:51

Cytat(SmokAnalog @ 5.02.2018, 18:47:27 ) *
Przyszła mi ochota na kuchnię włoską.


Czyżbyś dawno makaronu nie jadł tongue.gif

Napisany przez: SmokAnalog 5.02.2018, 22:20:32

Oj tak, szczególnie tego długiego cienkiego biggrin.gif

A mówiąc poważnie, Twój kod to koszmar. Zupełnie nieczytelny i bez sensu rozlazły. Dlaczego nie ułatwisz sobie życia i nie użyjesz wyrażenia regularnego? Całą sprawę ze sprawdzaniem IP mógłbyś załatwić jedną linijką, choć lepiej moim zdaniem sprawdzić wyrażeniem regularnym ogólną strukturę: ^\d{1,3}(?:\.\d{1,3}){3}$ i potem posprawdzać elegancko czy te liczby nie przekraczają 255.

Napisany przez: viking 5.02.2018, 22:23:01

Jest jeszcze ipv6

Napisany przez: topcio 5.02.2018, 23:08:32

Cytat(SmokAnalog @ 5.02.2018, 22:20:32 ) *
Oj tak, szczególnie tego długiego cienkiego biggrin.gif

A mówiąc poważnie, Twój kod to koszmar. Zupełnie nieczytelny i bez sensu rozlazły. Dlaczego nie ułatwisz sobie życia i nie użyjesz wyrażenia regularnego? Całą sprawę ze sprawdzaniem IP mógłbyś załatwić jedną linijką, choć lepiej moim zdaniem sprawdzić wyrażeniem regularnym ogólną strukturę: ^\d{1,3}(?:\.\d{1,3}){3}$ i potem posprawdzać elegancko czy te liczby nie przekraczają 255.


Czemu uważasz że koszmar, co jest tam nie tak. Co jest wg Ciebie nie czytelne? IPV6 mnie nie interesuje w tym przypadku.
Troszkę go skróciłem, ale nic nie zmieniałem tongue.gif

  1. if ( $("#dvr_wan_ip_adress").parents("#dvr_register_form").length == 1 ) {
  2. if ( $('#dvr_wan_ip_adress').val().length == 0 ) {
  3. ValidatorID = $( '#dvr_wan_ip_adress' );
  4. Info_Message = "Należy Podać Adres IP WAN Rejestratora !!!";
  5. Error_Message();
  6. return false;
  7. };
  8. if ( $('#dvr_wan_ip_adress').val().length != 0 ) {
  9. var validChars = "0123456789";
  10. var input = $( '#dvr_wan_ip_adress' ).val();
  11. var ip_address = input.length >= 7 && input.length <= 16;
  12. ValidatorID = "Adres IP ma Niepoprawną Wartość !!!";
  13. if(ip_address) {
  14. var dot_count = 0;
  15. for ( var i = 0; i < input.length; i++ ) {
  16. if (input[i]=='.') {
  17. dot_count++;
  18. }
  19. }
  20. if (dot_count === 3) {
  21. var delimiter_1 = input.indexOf( ".", 0 );
  22. var delimiter_2 = input.indexOf( ".", delimiter_1 + 1);
  23. var delimiter_3 = input.indexOf( ".", delimiter_2 + 1);
  24. var delimiter_4 = input.length;
  25. var section_1 = delimiter_1;
  26. if (section_1 >= 1 && section_1 <= 3) {
  27. var section_2 = delimiter_2 - delimiter_1 - 1;
  28. if (section_2 >= 1 && section_2 <= 3) {
  29. var section_3 = delimiter_3 - delimiter_2 - 1;
  30. if (section_3 >= 1 && section_3 <= 3) {
  31. var section_4 = delimiter_4 - delimiter_3 - 1;
  32. if (section_4 >= 1 && section_4 <= 3) {
  33. var pairs = input.http://www.php.net/split(".");
  34. for ( var i=0, psl = pairs.length, pair, j; i < psl; i++ ) {
  35. pair = pairs[i];
  36. for ( j = 0; j < pair.length; j++) {
  37. if ( validChars.indexOf( pair.charAt(j) ) === -1 ) { Error_Message(); return false; }
  38. }
  39. if ( pair > 255 ) { Error_Message(); return false; }
  40. }
  41. }
  42. } else { Error_Message(); return false; }
  43. } else { Error_Message(); return false; }
  44. } else { Error_Message(); return false; }
  45. } else { Error_Message(); return false; }
  46. } else { Error_Message(); return false; }
  47. }
  48. };

Napisany przez: SmokAnalog 5.02.2018, 23:36:52

To jest typowy kod spaghetti. Masz osobne zmienne dla poszczególnych części tej samej rzeczy, wielkie zagnieżdżenia, milion razy powtarzasz tę samą linijkę dla różnych etapów kodu. Tak można wymieniać.

Całe sprawdzanie poprawności adresu IP v4 możesz załatwić tak:

[JAVASCRIPT] pobierz, plaintext
  1. function isIPv4(string) {
  2. return string.match(/^\d{1,3}(?:\.\d{1,3}){3}$/) !== null && string.split(".").filter(number => number >= 256).length === 0;
  3. }
  4.  
  5. // Testy:
  6.  
  7. isIPv4("1.2.3.4"); // true
  8. isIPv4("LOL"); // false
  9. isIPv4("255.255.255.255"); // true
  10. isIPv4("255.256.255.255"); // false
[JAVASCRIPT] pobierz, plaintext

Napisany przez: topcio 5.02.2018, 23:43:39

Wiesz, uczę się i wg mnie myślę że dobrze mi idzie, choć mój kod to spaghetti wykonuje to co Twój. Może jak będę miał taką wiedzę jak Ty nie będę tak pisał tylko skracał do jednej linijki. Dla mnie liczy się to że do czegoś doszedłem sam. Nie mniej dziękuję za pomoc, ale uwierz mi napisanie komuś na forum (gdzie oczekuje się nakierowania czy pomocy) że jego kod jest do d. itp itp nie jest motywujące.
To tak jakby w szkole nauczycielka dziecku powiedziała, że niczego się w życiu nie nauczy. Zastanów się nad tym.

Napisany przez: SmokAnalog 5.02.2018, 23:47:08

Ale od tego są kursy, a nie forum. Jeśli wchodzę na forum dla myśliwych i zadaję pytanie "jak ustrzelić dzika pistoletem na wodę", to nie mogę oczekiwać odpowiedzi jak to faktycznie zrobić. Ucz się i zadawaj konkretne pytania, a nie jak sprzątać śmietnik.

Napisany przez: topcio 6.02.2018, 01:27:40

a powiedz mi proszę, czy poniższy kod też byś jakoś uprościł

  1. if ( $("#dvr_wan_tcp_port").parents("#dvr_register_form").length == 1 ) {
  2. if ( $('#dvr_wan_tcp_port').val().length == 0 ) {
  3. ValidatorID = $( '#dvr_wan_tcp_port' );
  4. Info_Message = "Należy Podać WAN TCP Port Rejestratora !!!";
  5. Error_Message();
  6. return false;
  7. }
  8. if ( $('#dvr_wan_tcp_port').val().length != 0 ) {
  9. ValidatorID = $( '#dvr_wan_tcp_port' );
  10. var validChars = "0123456789";
  11. var input = $( '#dvr_wan_tcp_port' ).val();
  12. for ( j = 0; j < input.length; j++) {
  13. if ( validChars.indexOf( input.charAt(j) ) === -1 ) {
  14. Info_Message = "WAN TCP Port - Użyto Niepoprawnych Znaków !!!";
  15. Error_Message();
  16. return false;
  17. } else {
  18. if ( ValidatorID.val() > 65535 ) {
  19. Info_Message = "WAN TCP Port - Wartość Spoza Zakresu !!!";
  20. Error_Message();
  21. return false;
  22. }
  23. }
  24. }
  25. }
  26. };

Napisany przez: SmokAnalog 6.02.2018, 01:51:24

Tak, ten kod też bym uprościł. Kilka uwag na początek:

  1. Po co sprawdzasz czy formularz istnieje? Chyba nie znika i nie pojawia się magicznie?
  2. Jak gdzieś zwracasz z return, nie musisz już dawać poniżej sprawdzania czy warunek przeciwny zaszedł. Wiadomo, że zaszedł.
  3. Tutaj też sprawdzanie poprawności znaków w pętli to bardzo nieelegancki sposób.
  4. Bardzo dużo kodu się powtarza.

Napisany przez: topcio 6.02.2018, 02:11:19

Ok dzięki.

1. Sprawdzam czy formularz istnieje bo napisane jest to w jednej funkcji dla wielu formularzy.
2. Chodzi np o to

  1. return false;
  2. } else {
  3. if ( ValidatorID.val() > 65535 ) {

3. czyli te wszystkie sprawdzenia lepiej robić na wyrażeniach regularnych regex
4. Kod się powtarza, bo zmienia się komunikat, więc muszę upchnąć go do zmiennej i zmienia się div, który zmieni kolor jak będzie błąd.

Jest to pisane dla biura, gdzie trzeba prowadzić za rączkę, np nie wpisałeś kropki, za dużo znaków itp itd, chcę oszczędzić sobie telefonów z pytaniami

Napisany przez: SmokAnalog 6.02.2018, 02:30:30

Możesz to uprościć w tym stylu:

[JAVASCRIPT] pobierz, plaintext
  1. if ( $("#dvr_register_form").length == 1 ) {
  2. let port = $('#dvr_wan_tcp_port').val();
  3.  
  4. try {
  5. if ( port === "" ) {
  6. throw "Należy Podać WAN TCP Port Rejestratora !!!";
  7. }
  8.  
  9. if ( /^\d+$/.match(port) === null ) {
  10. throw "WAN TCP Port - Użyto Niepoprawnych Znaków !!!";
  11. }
  12.  
  13. if ( port > 65535 ) {
  14. throw "WAN TCP Port - Wartość Spoza Zakresu !!!";
  15. }
  16. } catch (exception) {
  17. Info_Message = exception;
  18. Error_Message();
  19. return false;
  20. }
  21. };
[JAVASCRIPT] pobierz, plaintext


Czyli znowu wyjątki. Tylko że nie podoba mi się Twoja funkcja Error_Message(). Dobrze się domyślam, że ona korzysta z globalnej zmiennej Info_Message? Nie lepiej przekazywać jej wiadomość jako parametr?

Napisany przez: topcio 6.02.2018, 02:37:17

nie znałem jeszcze takiego sposobu, ale wygląda znacznie lepiej dla oka niż mój tongue.gif

początek pliku ze skryptem

[JAVASCRIPT] pobierz, plaintext
  1. var ValidatorID = '';
  2. var Info_Message = '';
  3.  
  4. function Remove_Required() {
  5. $('.error').removeClass("error");
  6. $("input").prop('required',false);
  7. setTimeout(function() { $('#message').removeAttr( 'style' );}, 1000);
  8. ValidatorID.removeAttr( 'onmouseover' );
  9. }
  10.  
  11. function Error_Message() {
  12. ValidatorID.prop('required', true).addClass( 'error' ).attr( 'onmouseover', 'return Remove_Required()' );
  13. setTimeout(function() { $('#message').addClass('error');}, 500);
  14. setTimeout(function() { $('#message').attr( 'style', 'color: rgba(220,20,60,1)' );}, 500);
  15. $( '#message' ).html(Info_Message);
  16. ValidatorID.prop('required', true);
  17. return false;
  18. }
[JAVASCRIPT] pobierz, plaintext


Napisany przez: SmokAnalog 6.02.2018, 02:40:15

Ten kod mógłby być poprawiony w prawie każdej linijce, ale najważniejsze na ten moment jest to, że Info_Message chyba nie musi być globalną zmienną?

Napisany przez: topcio 6.02.2018, 03:05:36

mam w panelu klient diva o id message i do tego diva chce pakować wszystkie informacje nie tylko z formularzy, dlatego ustawiłem zmienną Info_Message jako globalną i oddzielną funkcję Error_Message, która będzie ją przechwytywała.


możesz zerknąć jak to wygląda
topcio.pl

login: test
hasło: test1234

to czego dotyczy w/w skrypt jest w Dodaj Rejestrator

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)