Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    333

    Come ridurre ad un massimo di 2 il numero di caratteri uguali e consecutivi in una stringa

    Ciao a tutti,
    al submit passo alla funzione di controllo il valore di un campo di testo.
    A volte accade che l'utente scriva 3 o più lettere uguali consecutive soprattutto a fine parola e io voglio che le lettere uguali consecutive siano non più di due
    Per esempio tettto deve diventare tetto
    altre volte addirittura l'utente tiene schiacciato un tasto producendo una sequenza di lettere uguali e anche qui vorrei tagliarle ad un massimo di 2
    quindi da così: jjjjjjjjjjjjjjjjjjjjjjj a così jj
    Con la regex /(\w+)\1{2,}/ trovo se sono state battute lettere identiche consecutive in quantità maggiore a 2 ma non riesco a ridurle a 2
    Come si può fare?
    Grazie
    Ultima modifica di jomla; 13-05-2017 a 23:13

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Boh.

    regex /(\w+)\1{2}\1+/
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao, dovresti usare un replace().

    Potresti inoltre impostarlo direttamente durante la digitazione, con una cosa del genere:
    codice:
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>Esempio</title>
        <meta charset="utf-8">
      </head>
      <body>
        <input id="tuoinput">
        <script>
          function limita(){
            this.value = this.value.replace(/(\w)\1{2,}/g,'$1$1');
          }
          tuoinput.addEventListener('input', limita);
          limita.call(tuoinput);
        </script>
      </body>
    </html>
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    333
    Grazie mille KillerWorm
    anch'io usavo un replace ma era un codice più complicato del tuo in cui testato dapprima se erano state battute troppe lettere uguali per poi toglierle ma la regex mi dava dei problemi in fase di replace ...
    Fatto sta che se uno teneva schiacciato un tasto si bloccava tutto.
    anche adesso si blocca tutto se si tiene premuto a lungo un tasto ma sopporta di più di prima questa situazione.
    Peccato che non funzioni con tutti i tasti tipo ò è é e lo spazio come puoi vedere direttamente
    http://www.iomla.net/vocadiv/

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    333
    Per quanto riguarda i caratteri che mancavano ho fatto una piccola modifica alla regex e il risultato è ottimo.
    Resta il fatto che in locale è molto stabile alla pressione continua dei tasti mentre sul server va in tilt
    Se volete guardarci :
    http://www.iomla.net/vocadiv/

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    La domanda è "perché qualcuno dovrebbe tenere premuto un qualsivoglia tasto o scrivere una sequenza di lettere uguali in quel modo lì"?!
    Qual'è la probabilità che accada questo? ..e soprattutto, perché potrebbe accadere?
    Se accade spesso, suppongo dipenda dal fatto che il tuo codice abbia parecchi rallentamenti dovuti più che altro alle chiamate Ajax e a tutto il sistema che stai usando per creare il dropdown dei termini validi e verificarne la corrispondenza col testo inserito. Dalla console web noto, tra l'altro, che avviene una doppia chiamata...
    anche adesso si blocca tutto se si tiene premuto a lungo un tasto ma sopporta di più di prima questa situazione.
    boh, non so ma la cosa mi pare macchinosa e un po' contorta (imho ovviamente) a prescindere dall'aggiunta che vuoi inserire, oggetto di questa discussione. Io ho l'impressione che già il sistema che hai, senza quest'ultima aggiunta, sia abbastanza instabile.

    Ad ogni modo proverei ad impedire la/le richieste al server qualora avvenga la "cancellazione" delle lettere duplicate. Infatti (in linea di massima), in tal caso il testo non subisce variazioni rispetto alla situazione precedente (cioè quando la lettera duplicata viene eliminata), per cui non avrebbe senso aggiornare l'elenco dei termini ed eseguire tutto l'ambaradan che ci sta dietro, il quale va a creare rallentamenti.

    anch'io usavo un replace ma era un codice più complicato del tuo in cui testato dapprima se erano state battute troppe lettere uguali per poi toglierle ma la regex mi dava dei problemi in fase di replace
    Potrebbe essere la strada giusta, e in tal caso dovresti interrompere la funzione se il test è positivo, così da non lanciare ulteriori richieste al server.

    Io farei qualcosa del genere (poi vedi tu come applicarlo al tuo elaborato):
    codice:
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>Esempio</title>
        <meta charset="utf-8">
      </head>
      <body>
        <input id="tuoinput">
        <script>
          var i=0
          function limita(event){
            var reg = /(.)\1{2,}/g;
            if (reg.test(this.value)){
              this.value = this.value.replace(reg,'$1$1');
              return; // SE CI SONO RIPETIZIONI LA FUNZIONE SI INTERROMPE QUI
            }
            // ALTRIMENTI, QUI IL RESTO DELLE AZIONI, CHIAMATE AJAX E COMPAGNIA CANTANTE
            // ...
          }
          tuoinput.addEventListener('input', limita);
          limita.call(tuoinput);
        </script>
      </body>
    </html>
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    333
    Quote Originariamente inviata da KillerWorm Visualizza il messaggio
    La domanda � "perch� qualcuno dovrebbe tenere premuto un qualsivoglia tasto o scrivere una sequenza di lettere uguali in quel modo l�"?!

    Ciao, è molto semplice.
    Alcuni utenti che usano devices con touch screen si lamentano che quando battona una doppia spesso ne partono di più e ajax a lungo andare va in tilt.
    Non posso non credergli anche se nessun mio device lo fa.
    Per quanto riguarda le due chiamate che possono sembrare macchinose la prima è quella normale che manda al server la stringa di ricerca mentre la seconda scatta solo se la funzione callback si accorge che la risposta del server è vuota.
    In tal caso la funzione toglie l'ultima lettera al valore presente nel campo input e la rimanda al server finchè il dropdown sottostante si riempie di valori in quanto finalmente la stringa presente nel campo input trova corrispondenze nel database.
    Non avevo tempo per fare queste correzioni finchè andavo a scuola ma adesso che sono in pensione ci sto provando
    Grazie di tutto
    Ultima modifica di jomla; 16-05-2017 a 17:59

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.