2012-08-23 3 views
6

Vorrei convalidare una textarea e io proprio non capisco regex (Mi c'è voluto il giorno e un po 'di tutorial per capirlo).Regex: permettere tutto, ma alcuni caratteri selezionati

Fondamentalmente vorrei poter consentire tutto (interruzioni di riga e carri inclusi), ma i caratteri che potrebbero essere dannosi (quelli che potrebbero portare a una violazione della sicurezza). Dato che ci sono pochissimi caratteri che non sono ammessi, presumo che avrebbe più senso creare una lista nera piuttosto che una bianca.

La mia domanda è: qual è il "tutto, ma" standard in Regex?

Sto utilizzando JavaScript e jQuery.

Ho provato questo ma non funziona (è terribile, lo so ..):

var messageReg = /^[a-zA-Z0-9éèêëùüàâöïç\"\/\%\(\).'?!,@$#§-_ \n\r]+$/; 

Grazie.

+1

Cosa vuoi dire da essa non funziona? Qual è il codice che sta usando quella regex? –

+4

Questo non farà nulla per sicurezza. Un modulo può essere inviato senza javascript e anche senza utilizzare un browser (poiché si tratta solo di un certo tipo di richiesta HTTP). – Esailija

+1

RegEx non è davvero il modo giusto per essere al sicuro da violazioni della sicurezza. Questo [thread] (http://stackoverflow.com/questions/24723/best-regex-to-catch-xss-cross-site-scripting-attack-in-java) potrebbe essere interessante. Difesa contro XSS non è fatta con regex. – sQVe

risposta

1

Come accennato Esailija, questo non farà nulla per la sicurezza reale.

Il codice che hai citato è quasi un insieme negato, come menzionato da murgatroid99, lo ^ va all'interno delle parentesi. Quindi l'espressione regolare corrisponderà a tutto ciò che non è in quella lista. Ma sembra che tu voglia davvero spogliare quei personaggi, quindi la tua espressione regexp non deve essere negata.

Il codice dovrebbe essere simile:

str.replace(/[a-zA-Z0-9éèêëùüàâöïç\"\/\%\(\).'?!,@$#-_ \n\r]/g, ""); 

che dice: rimuovere tutti i personaggi nella mia espressione regolare.

Tuttavia, che sta dicendo non si desidera mantenere a-zA-Z0-9 siete sicuri di voler mettere a nudo quelli fuori?

Inoltre, Chrome non piace § nelle espressioni regolari, è necessario utilizzare il \x insieme al codice esadecimale per il carattere

+0

Fondamentalmente, volevo consentire quei caratteri (è un set grande ma era destinato a perdere un po 'di peso in seguito). grazie per la spiegazione – Baylock

15

Se si desidera escludere un insieme di caratteri (alcuni caratteri di punteggiatura, per esempio) si può usare l'operatore ^ all'inizio di un set di caratteri, in una regex come

/[^.?!]/ 

Questo corrisponde a qualsiasi carattere non è ., ? o !.

+0

Grazie per la risposta – Baylock

+2

In caso di overflow dello stack di solito preferiamo utilizzare voti anziché commenti per dire che una domanda è utile perché i commenti del genere sono generalmente considerati rumore e i voti sono più utili per gli altri. – murgatroid99

+0

Sì, la ragione per cui lo faccio è che non so come votare qui. Tutto quello che ho è la possibilità di controllare una bandiera verde. Ma c'è solo una bandiera consentita e troppe buone risposte. Sto cercando di capire questa cosa, ma ancora nessun indizio. – Baylock

6

È possibile utilizzare il ^ come primo carattere parentesi [] a negare ciò che è in esso:

/^[^abc]*$/ 

Ciò significa: "dall'inizio alla fine, senza a, b, o c"

+0

Grazie per la spiegazione! – Baylock