2012-03-09 15 views
9

Ho un numero di elementi DOM creati dinamicamente su una pagina web. I loro ID sono generati da un elenco esterno e talvolta questi nomi possono contenere caratteri non validi per un ID come "@" o "&".Javascript regex per rimuovere caratteri non consentiti dall'ID DOM

Devo rimuovere chracters che non corrispondono le seguenti regole:

  • La stringa deve iniziare con una lettera
  • Il primo carattere può essere seguita da un numero qualsiasi di lettere, cifre ([0- 9]), trattini ("-"), di sottolineatura ("_"), due punti (":") e punti()

Quindi, se la stringa originale è:

""

99% delle persone non sono l'1%

Poi la stringa risultante con caratteri non validi rimossi sarebbe:

ofPeoplearenotthe1

Qualcuno mi può aiutare a scrivere l'espressione regolare in Javascript che rimuoverà i caratteri da una stringa che non rispetta i requisiti di cui sopra?

+2

Vuoi dire che dovrebbe essere 'ofPeoplearenotthe1'? – Qtax

+0

Hai assolutamente ragione. Ho aggiornato la domanda. –

risposta

22
var str = "99% of People are not the 1%"; 
str = str.replace(/^[^a-z]+|[^\w:.-]+/gi, ""); 
+4

Nota che anche gli ID devono essere unici. Se stai rimuovendo i personaggi illegali per rispettare gli standard, dovrai anche mantenere un elenco di ID "usati", in modo da evitare collisioni. – Matt

+0

ciao ... puoi fornire la versione C# di questa espressione regolare per favore ... ?? –

+3

@ umair.ali, sarebbe praticamente lo stesso, e potrebbe essere citato in questo modo: '@" (? I:^[^ az] + | [^ \ w: .-] +) "' – Qtax

1
var id = "99% of People are not the 1%"; 
id = id.replace(/[^a-z0-9\-_:\.]|^[^a-z]+/gi, ""); 

Dimostrazione: http://jsfiddle.net/jfriend00/qqjh6/

L'idea è quella di sostituire uno o più caratteri non alfa all'inizio e quindi sostituire tutti gli altri caratteri illegali nella parte restante della stringa.

Si potrebbe chiedere a che cosa serve persino avere un ID non noto in anticipo e generato dinamicamente in base al contenuto. Non si può usare molto bene nei CSS se si basa su alcuni contenuti che possono cambiare.

+0

Questo visualizzerà" 9ofPeoplearenotthe1 ", gli ID non possono iniziare con un numero. –

+0

@Rocket: sei troppo veloce. Era già stato modificato per correggerlo anche prima di pubblicare il tuo commento. – jfriend00

+0

Oggi sono molto veloce, probabilmente ho qualcosa a che fare con tutta la caffeina. –

1

Se qualcuno ha bisogno di questo in Java:

if(! htmlId.matches("^[A-Za-z0-9]+[\\w\\-\\:\\.]*$")){ 
     LOG.warn("html id "+htmlId+" is not valid, have to remove all invalid chars"); 

     htmlId = htmlId.replaceAll("[^^A-Za-z0-9\\w\\-\\:\\.]+", ""); 
    } 

Nel mio caso ho controllato la corda e sostituito tutti non valido con vuoto. Grazie a Qtax.

1

La specifica HTML5 è stato aggiornato e secondo https://html.spec.whatwg.org/multipage/dom.html#global-attributesid attributi possono ora contenere letteralmente qualsiasi carattere per il loro valore tranne spazi bianchi.

Quando specificato negli elementi HTML, il valore di attributo ID deve essere univoco tra tutti gli ID di albero dell'elemento e deve contenere almeno un carattere. Il valore non deve contenere spazi bianchi ASCII.

non sono sicuro al quale elementi punto potrebbero essere assegnati due id attributi né quale ragionamento obiettivo logico per esso (forse la comprensione meno maturato al momento), tuttavia, che è stato bocciato dalla norma, tuttavia, che è stato conoscenza comune nella comunità di sviluppo web ormai da anni.

+0

Penso che "l'unicità" menzionata nella specifica non riguardi un possibile incarico di due ID a un elemento. Ma il requisito dell'ID deve essere unico all'interno dell'albero DOM. In modo che possa servire il suo scopo principale: aiutare con l'identificazione e gli elementi di riferimento. Nella maggior parte dei casi le classi sarebbero sufficienti (e sono per lo più più flessibili). Ma un esempio in cui gli ID sono ancora necessari è quando si collegano gli input del campo modulo con le etichette tramite l'attributo "for" dell'etichetta: '

0

Se si desidera qualcosa che resista ai conflitti, provare a utilizzare btoa per convertire in base64;

var badId1 = "99% of the 1%"; 
var badId2 = "999% of the 1%"; 
var validId1 = "ID_OTklIG9mIHRoZSAxJQ"; 
var validId2 = "ID_OTk5JSBvZiB0aGUgMS"; 

var makeId = function(text) { return "ID_" + btoa(text).slice(0,-2); }; 

expect(makeId(badId1)).toEqual(validId1); 
expect(makeId(badId2)).toEqual(validId2); 

Nota come i due ID generano chiavi diverse, in cui il regex trim non lo farebbe.

Problemi correlati