Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> CharAt
topcio
post 4.02.2018, 21:16:33
Post #1





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trueblue
post 4.02.2018, 21:29:15
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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/...-validation.php

Ten post edytował trueblue 4.02.2018, 21:35:30


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post 5.02.2018, 01:27:09
Post #3





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
topcio
post 5.02.2018, 02:05:31
Post #4





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


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.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ć.
Go to the top of the page
+Quote Post
trueblue
post 5.02.2018, 08:16:12
Post #5





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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

Czy ja wiem, wygląda naprawdę kompaktowo.


--------------------
Go to the top of the page
+Quote Post
topcio
post 5.02.2018, 11:24:18
Post #6





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
SmokAnalog
post 5.02.2018, 18:47:27
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Przyszła mi ochota na kuchnię włoską.
Go to the top of the page
+Quote Post
topcio
post 5.02.2018, 19:14:51
Post #8





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


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


Czyżbyś dawno makaronu nie jadł tongue.gif
Go to the top of the page
+Quote Post
SmokAnalog
post 5.02.2018, 22:20:32
Post #9





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
viking
post 5.02.2018, 22:23:01
Post #10





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Jest jeszcze ipv6


--------------------
Go to the top of the page
+Quote Post
topcio
post 5.02.2018, 23:08:32
Post #11





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


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.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. };
Go to the top of the page
+Quote Post
SmokAnalog
post 5.02.2018, 23:36:52
Post #12





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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


Ten post edytował SmokAnalog 5.02.2018, 23:37:20
Go to the top of the page
+Quote Post
topcio
post 5.02.2018, 23:43:39
Post #13





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
SmokAnalog
post 5.02.2018, 23:47:08
Post #14





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
topcio
post 6.02.2018, 01:27:40
Post #15





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


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. };
Go to the top of the page
+Quote Post
SmokAnalog
post 6.02.2018, 01:51:24
Post #16





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
topcio
post 6.02.2018, 02:11:19
Post #17





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
SmokAnalog
post 6.02.2018, 02:30:30
Post #18





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
topcio
post 6.02.2018, 02:37:17
Post #19





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
SmokAnalog
post 6.02.2018, 02:40:15
Post #20





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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ą?
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.04.2024 - 21:26