2014-06-15 23 views
17

Il mio JavaScript è abbastanza arrugginito quindi qualsiasi aiuto con questo sarebbe fantastico. Ho il requisito di rilevare caratteri non stampabili (caratteri di controllo come SOH, BS ecc.) E caratteri ascii estesi come Ž in una stringa e rimuoverli ma non sono sicuro di come scrivere il codice?Corrispondenza caratteri non stampabili/non ascii e rimozione dal testo

Qualcuno può indicarmi la giusta direzione su come procedere? Questo è quello che ho finora:

$(document).ready(function() { 
    $('.jsTextArea').blur(function() { 
     var pattern = /[^\000-\031]+/gi; 
     var val = $(this).val(); 
     if (pattern.test(val)) {  
     for (var i = 0; i < val.length; i++) { 
      var res = val.charAt([i]); 
       alert("Character " + [i] + " " + res);    
     }   
    } 
    else { 
     alert("It failed"); 
    } 

    }); 
}); 
+0

La proprietà 'match' dovrebbe essere chiamata così:' isNonAscii.match ($ (this) .val()) '. Il programma non sa magicamente che vuoi abbinare il valore dell'input alla regex. – SeinopSys

+0

Grazie per l'input. Ha senso, ma come rimuovo il carattere non valido che viene rilevato dalla stringa nella casella di testo? –

+1

Ho deciso di cambiare il mio approccio a questo e andare per una soluzione lato server (dal momento che javascript può a volte essere disattivato nel browser dei client) –

risposta

-5

Per coloro che hanno questo problema e sono alla ricerca di un 'risolvere tutti' la soluzione ... è così che ho finalmente riparato:

public static string RemoveTroublesomeCharacters(string inString) 
{ 
    if (inString == null) 
    { 
     return null; 
    } 

    else 
    { 
     char ch; 
     Regex regex = new Regex(@"[^\u0000-\u007F]", RegexOptions.IgnoreCase); 
     Match charMatch = regex.Match(inString); 

     for (int i = 0; i < inString.Length; i++) 
     { 
      ch = inString[i]; 
      if (char.IsControl(ch)) 
      { 
       string matchedChar = ch.ToString(); 
       inString = inString.Replace(matchedChar, string.Empty); 
      } 
     } 

     while (charMatch.Success) 
     { 
      string matchedChar = charMatch.ToString(); 
      inString = inString.Replace(matchedChar, string.Empty); 
      charMatch = charMatch.NextMatch(); 
     } 
    }  

    return inString; 
} 

ti rompo giù un poco particolare per quelli meno esperti:

  1. Noi primo ciclo attraverso ogni carattere della stringa e utilizzare il metodo IsControl di char per determinare se un carattere è un carattere di controllo o meno.

  2. Se viene trovato un carattere di controllo, copiare il carattere corrispondente in una stringa, quindi utilizzare il metodo Sostituisci per modificare il carattere di controllo in una stringa vuota. Risciacquare e ripetere per il resto della stringa.

  3. Una volta eseguita l'intera stringa, utilizziamo la regex definita (che corrisponde a qualsiasi carattere che non sia un carattere di controllo o un carattere standard ASCII) e sostituisca nuovamente il carattere con una stringa vuota. Fare questo in un ciclo while significa che per tutto il tempo che charMatch è vero il carattere verrà sostituito.

  4. Infine, una volta rimossi tutti i caratteri e riavvolto l'intera stringa, viene eseguita l'inString.

(Nota: non ho ancora ancora riuscito a capire come ripopolare TextBox con il nuovo valore inString modificato, quindi se qualcuno può indicare come può essere fatto che sarebbe grande)

+2

Qui hai risposte perfettamente valide e la tua soluzione è basata su di esse. Anche \ u0000- \ u0020 sono caratteri di controllo. –

1

È necessario assegnare un modello (invece di stringa) in isNonAscii variabile, quindi utilizzare test() per verificare se corrisponde. test() restituisce vero o falso.

$(document).ready(function() { 
    $('.jsTextArea').blur(function() { 
     var pattern = /[^\000-\031]+/gi; 
     var val = $(this).val(); 
     if (pattern.test(val)) { 
      alert("It matched"); 
     } 
     else { 
      alert("It did NOT match"); 
     } 
    }); 
}); 

check jsFiddle

+0

Mille grazie per la risposta, ma come posso rilevare il char non valido, rimuovere se dalla stringa e sostituire la nuova stringa senza il char non valido nella casella di testo? –

+0

L'uso della funzione 'replace()' dovrebbe funzionare al previsto. Puoi farlo direttamente invece di quel pezzo di codice. @ Il codice di CasimiretHippolyte funziona bene – kosmos

26

Non c'è bisogno di provare, è possibile elaborare direttamente il contenuto casella di testo:

textBoxContent = textBoxContent.replace(/[^\x20-\x7E]+/g, ''); 

dove la gamma \x20-\x7E copre la parte stampabile della tabella ASCII.

Esempio con il tuo codice:

$('.jsTextArea').blur(function() { 
    this.value = this.value.replace(/[^\x20-\x7E]+/g, ''); 
}); 
+0

Grazie per l'input ma non funzionerà in quanto la funzione di sostituzione funziona solo con caratteri stampabili. I caratteri di controllo come BS, SOH, ACK ecc sono invisibili e quindi non vengono rilevati con il metodo .replace. –

+0

@GrantDoole: Che idea pazzesca! Solo perché un personaggio non è stampabile non significa che il metodo di sostituzione non lo troverà! Il metodo di sostituzione funziona con qualsiasi carattere (stampabile o non). –

+0

Davvero? È strano perché l'ho appena testato e non ha funzionato? Sei in grado di mostrarmi? –

25

di indirizzare i caratteri che non fanno parte della gamma stampabili ASCII di base, è possibile utilizzare questa semplice espressione regolare:

`[^ -~]+` 

Spiegazione: nella prima 128 caratteri dello ASCII table, l'intervallo stampabile inizia con il carattere spazio e termina con una tilde. Questi sono i personaggi che vuoi mantenere. Tale intervallo è espresso con [ -~] e i caratteri non compresi in tale intervallo sono espressi con [ -~]. Questi sono quelli che vogliamo sostituire. Pertanto:

result = string.replace(/[^ -~]+/g, ""); 
+2

In effetti è più semplice. –

+0

@CasimiretHippolyte Grazie, Caz. :) – zx81

+0

Ciao, ottime risposte su tutti ma e sono vicino alla risoluzione. Mentre value.replace funziona molto bene, non è esattamente ciò di cui ho bisogno. Aggiornerò il post originale con quello che ho finora. –

Problemi correlati