2010-07-29 3 views
11

Ciao Sto usando il metodo indexOf per cercare se una stringa è presente all'interno di un'altra stringa. Ma voglio ottenere tutte le posizioni di dove è stringa? Esiste un metodo per ottenere tutte le posizioni in cui esiste la stringa?Cerca tutte le istanze di una stringa all'interno di una stringa

<html> 
<head> 
    <script type="text/javascript"> 
     function clik() 
     { 
      var x='hit'; 
      //document.getElementById('hideme').value =''; 
      document.getElementById('hideme').value += x; 
      alert(document.getElementById('hideme').value); 
     } 

     function getIndex() 
     { 
      var z =document.getElementById('hideme').value; 
      alert(z.indexOf('hit')); 
     } 
    </script> 
</head> 
<body> 
    <input type='hidden' id='hideme' value=""/> 
    <input type='button' id='butt1' value="click click" onClick="clik()"/> 
    <input type='button' id='butt2' value="clck clck" onClick="getIndex()"/> 
</body> 
</html> 

Esiste un metodo per ottenere tutte le posizioni?

risposta

31

Prova qualcosa di simile:

var regexp = /abc/g; 
var foo = "abc1, abc2, abc3, zxy, abc4"; 
var match, matches = []; 

while ((match = regexp.exec(foo)) != null) { 
    matches.push(match.index); 
} 

console.log(matches); 
+0

Ho dimenticato così facilmente che l'oggetto match ha la proprietà "index"! – Pointy

+0

Grazie mille amico! regex ha fatto il trucco !! – sai

1

Non so se c'è una funzione integrata per farlo. Si potrebbe fare in un semplice ciclo però:

function allIndexes(lookIn, lookFor) { 
    var indices = new Array(); 
    var index = 0; 
    var i = 0; 
    while(index = lookIn.indexOf(lookFor, index) > 0) { 
     indices[i] = index; 
     i++; 
    } 
    return indices; 
} 
+0

Il tuo codice non funziona: - Hai un ciclo infinito se viene trovato un termine (indexOf inizia nel pos trovato) - Ignorerà sempre la prima occorrenza mentre testate indexOf (...)> 0 invece di> = 0 – Congelli501

0

È possibile utilizzare indexOf ('searchstring',), utilizzando l'indice restituito 'ultima volta che giro' + 1 fino ad arrivare -1 indietro.

0

Ecco un modo regex per farlo:

function positions(str, text) { 
    var pos = [], regex = new RegExp("(.*?)" + str, "g"), prev = 0; 
    text.replace(regex, function(_, s) { 
    var p = s.length + prev; 
    pos.push(p); 
    prev = p + str.length; 
    }); 
    return pos; 
} 
12

Ecco una funzione di lavoro:

function allIndexOf(str, toSearch) { 
    var indices = []; 
    for(var pos = str.indexOf(toSearch); pos !== -1; pos = str.indexOf(toSearch, pos + 1)) { 
     indices.push(pos); 
    } 
    return indices; 
} 

Uso esempio:

> allIndexOf('dsf dsf kfvkjvcxk dsf', 'dsf'); 
[0, 4, 18]