2011-09-13 17 views
7

Sto provando a convalidare un modulo utilizzando un'espressione regolare trovata qui http://regexlib.com/. Quello che sto cercando di fare è filtrare tutti i caratteri tranne a-z, virgole e apostrofi. Se utilizzo questo codice:Escaping apostrofi in regex?

<cfinput name="FirstName" type="text" class="fieldwidth" maxlength="90" required="yes" validateat="onsubmit,onserver" message="Please ensure you give your First Name and it does not contain any special characters except hyphens or apostrophes." validate="regular_expression" pattern="^([a-zA-Z'-]+)$" /> 

Viene visualizzato il seguente errore: Non corrispondente [] nell'espressione. Ho capito questo si riferisce a l'apostrofo perché funziona se uso questo codice (ma non consente apostrofi):

<cfinput name="FirstName" type="text" class="fieldwidth" maxlength="90" required="yes" validateat="onsubmit,onserver" message="Please ensure you give your First Name and it does not contain any special characters except hyphens or apostrophes." validate="regular_expression" pattern="^([a-zA-Z-]+)$" /> 

Quindi mi chiedo c'è qualche modo speciale per sfuggire apostrofi quando si utilizzano le espressioni regolari?

EDIT

Penso di aver trovato dove il problema è causato (grazie a Xanatos), non è sicuro come risolvere il problema. Fondamentalmente CF sta generando un campo nascosto per convalidare il campo come segue:

<input type='hidden' name='FirstName_CFFORMREGEX' value='^([a-zA-Z'-]+)$'> 

perché utilizza singoli apostrofi anziché apici intorno al valore, interpreta l'apostrofo come la fine del valore.

+0

L'apostrofo è un carattere speciale e deve essere scappato dal testo standard anteponendo con ' \ ', prova pattern = "^ ([a-zA-Z \' -] +) $" HTH – John

+1

@John Sei sicuro? E cosa significa? Come viene utilizzato nella "lingua" del Regex? – xanatos

+0

Dico "prova" quindi non ne sono sicuro, l'espressione regolare ha molti aromi e la sostituzione delle espressioni taggate è in realtà assente dal mio programma Word 2002. – John

risposta

7

Penso che ci sia un bug nell'implementazione cfinput. Probabilmente usa la stringa che passi in pattern in un Javascript Regex ma usa lo ' per citarla. Così lo converte in:

new Regex('^([a-zA-Z'-]+)$') 

provare a sostituire la citazione con \x27 (è il codice per il singolo apice)

+0

Grazie per quello xanato, purtroppo anche questo non funziona. La convalida Javascript funziona davvero bene con il mio originale, ma è la convalida lato server dove si trova il problema. Se non riuscirò più a farlo, potrei semplicemente provare a scrivere qualcosa per convalidarlo sul lato server. – Kristian82

+0

@ Kristian82 Prova questo :-) – xanatos

+1

Il mio commento non ha senso ora, grazie mille ... – Kristian82

0

L'ineguagliato] è perché il trattino è considerato come un intervallo tra i due caratteri attorno ad esso. Metti il ​​trattino all'inizio come una buona pratica.

^([-a-zA-Z']+)$ 
+2

Metterlo fino alla fine è la stessa buona pratica, nessuna differenza qui. – stema