Come sapere se una stringa contiene un determinato carattere in JavaScript?


335

Ho una pagina con una casella di testo in cui un utente dovrebbe inserire un codice di registrazione di 24 caratteri (lettere e numeri, senza distinzione tra maiuscole e minuscole). Ho usato maxlengthper limitare l'utente a inserire 24 caratteri.

I codici di registrazione sono generalmente indicati come gruppi di caratteri separati da trattini, ma vorrei che l'utente inserisse i codici senza i trattini.

Come posso scrivere il mio codice JavaScript senza jQuery per verificare che una determinata stringa che l'utente immette non contenga trattini o, meglio ancora, contenga solo caratteri alfanumerici?


2
La risposta trovata qui stackoverflow.com/questions/3192612 contiene le informazioni su come convalidare su alfanumerico.
JasCav,

1
E per imparare le espressioni regolari: regular-expressions.info
Felix Kling

Per te gente che dovresti e che potresti usare inArray.
JonH,

3
Il modo in cui l'input è formattato non è un problema umano. È il problema del computer. Prendi qualunque cosa entri l'utente e rimuovi tutti i caratteri che non appartengono (non alfa), verifica che il risultato sia lungo 24 caratteri, quindi convalida. L'utente odia davvero l'input formattato.
Tggagne,

Risposte:


592

Per trovare "ciao" in your_string

if (your_string.indexOf('hello') > -1)
{
  alert("hello found inside your_string");
}

Per il numero alfa puoi usare un'espressione regolare:

http://www.regular-expressions.info/javascript.html

Espressione regolare alfanumerica


È stato molto utile. Parlando come programmatore di Python, lo sto usando per sostituire la parola chiave "in" (che può essere o non essere non ortodossa, non sono sicuro) ma funziona per più di un singolo personaggio.
trevorKirkby,

1
Non capisco come sia stato votato alla risposta. Vedo che molte persone vengono qui da Google. Un modo migliore sarebbe sicuramente usare un'espressione regolare.
Spock,

25
Useresti un'espressione regolare per controllare un singolo personaggio? È un'eccessiva quantità di spese generali per ottenere esattamente la stessa cosa della funzione integrata. Ci sono molte persone che non capiscono la regex e in genere la risposta più semplice è la migliore.
kemiller2002,

Vorrei andare con /hello/g.test(your_string). Mentre indexOf funziona, penso che un test regex descriva una storia migliore di ciò che stai cercando di realizzare. Se sto cercando di trovare una sequenza di caratteri all'interno di una stringa, l'indice è irrilevante.
Joe Maffei,


69

Con ES6 .includes ()

"FooBar".includes("oo"); // true

"FooBar".includes("foo"); // false

"FooBar".includes("oo", 2); // false

E: Non supportato da IE - invece puoi usare Tilde opperator ~( Bitwise NOT ) con .indexOf ()

~"FooBar".indexOf("oo"); // -2 -> true

~"FooBar".indexOf("foo"); // 0 -> false

~"FooBar".indexOf("oo", 2); // 0 -> false

Utilizzato con un numero, l'operatore Tilde lo fa efficace ~N => -(N+1). Usalo con doppia negazione !!( Logical NOT ) per convertire i numeri in bool:

!!~"FooBar".indexOf("oo"); // true

!!~"FooBar".indexOf("foo"); // false

!!~"FooBar".indexOf("oo", 2); // false

Semplice, leggibile e restituisce un valore booleano. Perfetto per quando non hai bisogno di un'espressione regolare.
Bryanbraun,

1
** Si noti che il metodo include non è supportato da IE **
Bonez024

52

Se hai il testo in variabile foo:

if (! /^[a-zA-Z0-9]+$/.test(foo)) {
    // Validation failed
}

Questo verificherà e si assicurerà che l'utente abbia inserito almeno un carattere e abbia inserito solo caratteri alfanumerici.


La migliore risposta qui, tutte le altre risposte sono nulle dal mio pov.
chris_r,


11

ES6 contiene il metodo incorporato ( includes) in String's prototype, che può essere utilizzato per verificare se la stringa contiene o meno un'altra stringa.

var str = 'To be, or not to be, that is the question.';

console.log(str.includes('To be')); 

Il seguente polyfill può essere utilizzato per aggiungere questo metodo nei browser non supportati. ( Fonte )

if (!String.prototype.includes) {
  String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }
    
    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };
}


7

Utilizzare un'espressione regolare per ottenere questo risultato.

function isAlphanumeric( str ) {
 return /^[0-9a-zA-Z]+$/.test(str);
}

Questo verificherà esattamente una cifra e non accetterà tutti i caratteri alfanumerici, come desidera l'OP.
cdhowie,

@cdhowie .. ho dimenticato un +, ma ho anche letto male la domanda .. grazie per averlo sottolineato.
Gabriele Petrioli,

6

Stai pensando troppo. Basta usare una semplice espressione regolare, è il tuo migliore amico.

var string1 = "Hi Stack Overflow. I like to eat pizza."
var string2 = "Damn, I fail."

var regex = /(pizza)/g // Insert whatever phrase or character you want to find

string1.test(regex); // => true
string2.test(regex); // => false

Impara Regex in 5 minuti?


Quindi, per fare qualcosa di pratico con questo, dovresti semplicemente eseguirlo in una selezione:if ( string1.test(regex) ) { alert("He likes pizza!"); }
Adam McArthur,

E il tuo test alfanumerico sarebbe ...var regex = /^[a-z0-9]+$/i
Adam McArthur,

4
Questo è al contrario. Vedi developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… regexObj.test (str)
Ralph Yozzo

Indietro? regex.test(string1)
hlcs,

I tuoi metodi di esempio sono al contrario. Dovrebbe essere regex.test(str). ( str.match(regex)è simile, ma non restituisce un valore booleano.)
jsejcksn,

6

Se stai cercando caratteri all'inizio o alla fine della stringa, puoi anche usare startsWitheendsWith

const country = "pakistan";
country.startsWith('p'); // true
country.endsWith('n');  // true

5

var inputString = "this is home";
var findme = "home";

if ( inputString.indexOf(findme) > -1 ) {
    alert( "found it" );
} else {
    alert( "not found" );
}


4

Per verificare solo caratteri alfanumerici:

if (/^[0-9A-Za-z]+$/.test(yourString))
{
    //there are only alphanumeric characters
}
else
{
    //it contains other characters
}

Il regex sta testando 1 o più (+) dell'insieme di caratteri 0-9, AZ e az, iniziando con l'inizio dell'input (^) e terminando con la fine dell'input ($).


4

La risposta di Kevins è corretta ma richiede un numero "magico" come segue:

var containsChar = s.indexOf(somechar) !== -1;

In tal caso, devi sapere che -1 sta per non trovato . Penso che una versione leggermente migliore sarebbe:

var containsChar = s.indexOf(somechar) >= 0;

Ebbene secondo le originali , attuali , e progetti di norme, indexOf()restituirà -1 se la stringa non viene trovata. Quindi non è quasi più magico che usare 0 .
Tutti i lavoratori sono essenziali il

3

Prova questo:

if ('Hello, World!'.indexOf('orl') !== -1)
    alert("The string 'Hello World' contains the substring 'orl'!");
else
    alert("The string 'Hello World' does not contain the substring 'orl'!");

Ecco un esempio: http://jsfiddle.net/oliverni/cb8xw/


3

Anche la funzione di ricerca di String è utile. Cerca un carattere e una stringa secondaria in una determinata stringa.

'apple'.search('pl') ritorna 2

'apple'.search('x') ritorno -1


2

Se stai leggendo dati dal DOM come tag ap o h1, ad esempio, vorrai utilizzare due funzioni JavaScript native, è abbastanza semplice ma limitato a es6, almeno per la soluzione che sto per fornire. Cercherò tutti i tag p all'interno del DOM, se il testo contiene una "T" verrà rimosso l'intero paragrafo. Spero che questo piccolo esempio aiuti qualcuno!

HTML

<p>Text you need to read one</p>
<p>Text you need to read two</p>
<p>Text you need to read three</p>

JS

let paras = document.querySelectorAll('p');

paras.forEach(p => {
  if(p.textContent.includes('T')){
       p.remove();
    } 
});

1

Funziona perfettamente. Questo esempio aiuterà molto.

<script>    
    function check()
    {
       var val = frm1.uname.value;
       //alert(val);
       if (val.indexOf("@") > 0)
       {
          alert ("email");
          document.getElementById('isEmail1').value = true;
          //alert( document.getElementById('isEmail1').value);
       }else {
          alert("usernam");
          document.getElementById('isEmail1').value = false;
          //alert( document.getElementById('isEmail1').value);
       }
    }
</script>

<body>
    <h1>My form </h1>
    <form action="v1.0/user/login" method="post" id = "frm1">
        <p>
            UserName : <input type="text" id = "uname" name="username" />
        </p>
        <p>
            Password : <input type="text" name="password" />
        </p>
        <p>
            <input type="hidden" class="email" id = "isEmail1" name = "isEmail"/>
        </p>
        <input type="submit" id = "submit" value="Add User" onclick="return check();"/>
    </form>
</body>

0

Dimostrazione: il metodo include () trova il carattere "contiene" in tutta la stringa, restituirà un valore vero.

var string = "This is a tutsmake.com and this tutorial contains javascript include() method examples."

str.includes("contains");

//The output of this

  true


0

Controlla se la stringa è alfanumerica o alfanumerica + alcuni caratteri consentiti

Il metodo alfanumerico più veloce è probabilmente come menzionato in: Il modo migliore per controllare alfanumerico in Javascript mentre opera direttamente su intervalli di numeri.

Quindi, per consentire alcuni altri caratteri in modo sano possiamo semplicemente metterli in unaSet ricerca veloce.

Credo che questa implementazione gestirà correttamente le coppie surrogate .

#!/usr/bin/env node

const assert = require('assert');

const char_is_alphanumeric = function(c) {
  let code = c.codePointAt(0);
  return (
    // 0-9
    (code > 47 && code < 58) ||
    // A-Z
    (code > 64 && code < 91) ||
    // a-z
    (code > 96 && code < 123)
  )
}

const is_alphanumeric = function (str) {
  for (let c of str) {
    if (!char_is_alphanumeric(c)) {
      return false;
    }
  }
  return true;
};

// Arbitrarily defined as alphanumeric or '-' or '_'.
const is_almost_alphanumeric = function (str) {
  for (let c of str) {
    if (
      !char_is_alphanumeric(c) &&
      !is_almost_alphanumeric.almost_chars.has(c)
    ) {
      return false;
    }
  }
  return true;
};
is_almost_alphanumeric.almost_chars = new Set(['-', '_']);

assert( is_alphanumeric('aB0'));
assert(!is_alphanumeric('aB0_-'));
assert(!is_alphanumeric('aB0_-*'));
assert(!is_alphanumeric('你好'));

assert( is_almost_alphanumeric('aB0'));
assert( is_almost_alphanumeric('aB0_-'));
assert(!is_almost_alphanumeric('aB0_-*'));
assert(!is_almost_alphanumeric('你好'));

GitHub a monte .

Testato in Node.js v10.15.1.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.