Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej OK, rozumiem

[jquery]Zamiana znaków w ciągu.

Tworzenie dynamicznych stron internetowych z zastosowaniem JavaScript, jQuery, Ajax. Dowiedz się jak to zrobić, znajdź rozwiązania swoich problemów.

[jquery]Zamiana znaków w ciągu.

Post 08.01.2017, 19:53:53

Witam.
Mam pole input, do którego użytkownik wprowadza nazwę. Pobieram ciąg znaków aby zmienić wszystko na małe litery, spację chcę zastąpić znakiem "_", a polskie małe litery znakami bez ogonków.
Mama następujący kod
Kod: Zaznacz cały
$(document).ready(function() {
   $('.kategoria_nazwa_pole').keyup(function(){
      
      var nazwa = $('input[name=nazwa]');
      
      //zamian ciągu na małe znaki
      var ciag = nazwa.val();
      var ciag_maly = ciag.toLowerCase();
      
      var zastap_znaki = '';
      
      var tablica_zastap = ['ę', 'ó', 'ą', 'ś', 'ł', 'ż', 'ź', 'ć', 'ń', ' '];
      var tablica_robocze = ['e', 'o', 'a', 's', 'l', 'z', 'z', 'c', 'n', '_'];
      
      for(var i=0; i<tablica_zastap.length; i++) {
         zastap_znaki = ciag_maly.replace(tablica_zastap[i], tablica_robocze[i]);
      }
      
      $('.nazwa_robocza span').text(zastap_znaki);
      
   });//koniec kliknięcie #dodaj_kategoria
});//konec ready

Kod działa prawie dobrze. To znaczy, zamienia mi wprowadzony ciąg znaków na małe litery, jednak tylko pierwszą spację zamienia mi na "_" natomiast w ogóle nie zamienia mi polskich znaków na znaki łacińskie.
Nie wiem gdzie leży problem, że nie podmienia znaków?
nuter007
Posty: 128
Dołączył(a): 04.03.2014

Re: [jquery]Zamiana znaków w ciągu.

Post 08.01.2017, 20:26:36

Pierwszy problem polega na tym, że przetworzony ciąg zapisujesz w zmiennej zastap_znaki a przetwarzasz zawsze ciag_maly i to prowadzi do tego, że za każdym razem porzucasz wynik poprzedniego przetworzenia i przetwarzasz kolejną literkę na ciągu wejściowym. Zamień

Kod: Zaznacz cały
zastap_znaki = ciag_maly.replace(tablica_zastap[i], tablica_robocze[i]);
...
$('.nazwa_robocza span').text(zastap_znaki);

na
Kod: Zaznacz cały
ciag_maly = ciag_maly.replace(tablica_zastap[i], tablica_robocze[i]);
...
$('.nazwa_robocza span').text(ciag_maly);



Drugi problem polega na tym jak działa metoda .replace. Metoda ta jako pierwszy parametr oczekuje wyrażenia regularnego. Ty przekazujesz tekst, więc ten tekst zostanie przetworzony na wyrażenie regularne. Ale wyrażenia regularne mają też flagi, m.in. flagę 'g', która oznacza globalne wyszukiwanie. Bez tej flagi zamiana zakończy się po spotkaniu pierwszego dopasowania. A konwersja tekstu na wyrażenie regularne odbywa się bez ustawienia flag.
Możesz to naprawić poprzez zmianę
Kod: Zaznacz cały
var tablica_zastap = ['ę', 'ó', 'ą', 'ś', 'ł', 'ż', 'ź', 'ć', 'ń', ' '];

na
Kod: Zaznacz cały
var tablica_zastap = [/ę/g, /ó/g, /ą/g, /ś/g, /ł/g, /ż/g, /ź/g, /ć/g, /ń/g, / /g];


-- edit mały detal odnośnie replace
specyfikacja języka jednak wyróżnia szczególny przypadek

If searchValue is not a regular expression, let searchString be ToString(searchValue) and search string for the first occurrence of searchString.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19648
Dołączył(a): 14.04.2002

Re: [jquery]Zamiana znaków w ciągu.

Post 08.01.2017, 21:04:14

Działa znakomicie.
Dziękuję za wytłumaczenie.
nuter007
Posty: 128
Dołączył(a): 04.03.2014


Powrót do JavaScript


 


  • Podobne wątki
    Odpowiedzi
    Wyświetlone
    Ostatni post

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google Adsense [Bot] i 9 gości

Hosting, Domeny, SSL

Subskrypcja

Mamy 50710 zarejestrowanych użytkowników.
Najnowszy użytkownik: edwardmyers


Nasi użytkownicy napisali:

  • 936116 wiadomości
  • w 246733 tematach

Najnowsze wpisy na blogu

Najnowsze artykuły

Najaktywniejsi (ostatnie 30 dni)