2013-07-29 14 views
5

Ho una domanda riguardante il controllo dello string.Rileva se una stringa contiene una tabella

Il string è da un ckeditor così l'utente può inserire qualsiasi cosa.

Il nome variable è htmlData ed è come:

test here<br /> 
<table border="1" cellpadding="1" cellspacing="1" style="width: 500px;"> 
    <tbody> 
     <tr> 
      <td> 
       111</td> 
      <td> 
       222</td> 
     </tr> 
     <tr> 
      <td> 
       333</td> 
      <td> 
       444</td> 
     </tr> 
     <tr> 
      <td> 
       555</td> 
      <td> 
       666</td> 
     </tr> 
    </tbody> 
</table> 
<br /> 
second test 

voglio rilevare se l'utente aggiungere una struttura table e ho cercato

if(htmlData.indexOf('</table>').length > -1){ 
      console.log('table detected') 
     } 

ma non mostra nulla in il mio console. Qualcuno può dare un suggerimento su questo?

Grazie mille!

risposta

8

String. indexOf() restituisce un valore numerico primitivo, in particolare:

the index within the calling String object of the first occurrence of the specified value, starting the search at fromIndex or -1 if the value is not found.

Queste primitive non hanno proprietà, cioè .: length.

if(htmlData.indexOf('</table>').length > -1){ 
    console.log('table detected') 
}

Quindi, è sufficiente rimuovere .length dal codice:

if(htmlData.indexOf('</table>') > -1){ 
    console.log('table detected') 
} 
+2

Dio ... cosa sto pensando .... tutto +1 – FlyingCat

+0

si può avere ancora più breve se '(~ htmlData.indexOf ('')) {...} ' – oleq

3

Usa -

if(htmlData.indexOf('</table>') > -1){ 
     console.log('table detected') 
} 

o si può trovare per ogni tag utilizzando jQuery -

var el = $("<div>"+htmlData+"</div>"); 
if(el.find("table").length>0){ 
    console.log("it contains table"); 
} 

esso funzionerebbe per qualsiasi tag, classe, id o qualsiasi selettore di CSS.

var el = $(htmlData); 
if(el.find(".some-class").length>0){ 
    console.log("it contains some-class"); 
} 
+0

Credo che per fare in modo che il secondo suggerimento funzioni è necessario avvolgerlo in un contenitore' var el = $ ('

'+htmlData+'
'); ' –

+0

I penso che funzionerebbe senza avvolgerlo con 'div'. –

+0

Otterrai un errore 'Uncaught: Errore di sintassi, espressione non riconosciuta' http://jsfiddle.net/bplumb/CcxWV/ –

1

perché il .length?

if(htmlData.indexOf('</table>') > -1){ 
     console.log('table detected') 
    } 

Questo dovrebbe funzionare bene. indexOf restituisce l'indice (-1) se non trovato, non un array così proprietà length non è definita

3

Si può usare:

if(/<table>/i.test(htmlData)); 
+0

Ma questo non fa riferimento alla stringa dell'OP (htmlData) –

+0

Sì, hai ragione Lee Taylor, non leggo correttamente la domanda – Guerra

+0

OK, aggiorna o cancella. Grazie –

1

IndexOf non ha proprietà length. Come indica il nome "indice", ti dà l'indice . Inoltre: perché controllare solo se l'utente ha inserito un tag di chiusura? Dovresti anche controllare il tag di partenza. E poi- perché non usare una regex come:

/<table>.*?<\/table>/.test(htmlData) 

Per testare sia per ?.

CAVIA! Questo RegEx non sta verificando se l'utente ha inserito un tag html-Table valido. È solo uno stupido controllo per l'occorrenza di < tabella> resp. </tabella>.

+0

Stai utilizzando _CAVE_ come abbreviazione di _CAVEAT_? Non l'ho mai sentito prima. – canon

+0

um .. la mia grammatica latina è un po 'polverosa. ma per quanto mi ricordo è un vocativ come: cave canem! - guarda il cane !. Avvertenza significa qualcosa di simile: "tu puoi" o "devi" o "devi". Non so come tradurre la mia conoscenza della grammatica latina dal tedesco all'inglese;) –

1

Sarebbe sciocco aggiungere alla raccolta delle stesse risposte quindi, che ne dite di questo metodo utilizzando match, questo vi dirà quante tabelle ci sono in quella stringa.

var string = htmlData.replace(/\s/g, ""); 
// Trim all whitespace.. 

var matches = string.match(/<\/table>/g); 
// Will return 1 for your code and 2 for the demo 

Poi si dovrebbe controllare in questo modo

if(matches > 0) { 
    // There is at least 1 table here 
} 

Demo

Problemi correlati