Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [JAVASCRIPT] regExp suppongo

    Ciao a tutti,
    io ho una stringa di testo del genere:

    -------------------------------------------------------------------
    Il <selection type=\"1\">piccolo</selection> Giovanni stava un giorno a osservare il <selection type=\"1\">nuovo</selection> buco di talpa, che c'era nel giardinetto dietro casa. La talpa di <selection type=\"2\">questo</selection> buco buttava fuori una <selection type=\"1\">gran</selection> quantità di terriccio <selection type=\"1\">fresco</selection> e spiava il ragazzino.
    -------------------------------------------------------------------

    Io immagino tramite regExp dovrei separere questo testo e magari metterlo in un array in modo da poterlo maneggiare liberamente.
    L'array dovrebbe essere così:
    a[0]="Il";
    a[1]=["1","piccolo"];
    a[2]=" Giovanni stava un giorno a osservare il ";
    a[3]=["1","nuovo"];
    a[4]=" buco di talpa, che c'era nel giardinetto dietro casa. La talpa di ";
    a[5]=["2","questo"];

    E via di seguito per tutto il testo.
    Ci ho provato in mille modi ma le regExp non le so proprio usare.
    Cmq stopensando ad una strategia per farlo.
    Consigli e suggerimenti sono ben accetti.
    Grazie mille.
    http://www.beavermag.it

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non so se le RegExp sono lo strumento piu` adatto.

    Infatti si tratta di fare un parsing del tuo testo e spezzarlo secondo dei criteri.

    Forse dovresti prima fare uno split del testo con delimitatore lo spazio, indi cercare se ci sono delle stringhe che contengono caratteri < o > .

    Ad esempio:
    codice:
    testo = "Il <selection type=\"1\">piccolo</selection> Giovanni ....";
    var pezzi = testo.split(" ");
    var a = new Array();
    var n = 0;
    for (var i=0; i<pezzi.length; i++) {
      if (pezzi[i].indexOf("<")<0) {
        a[n] += pezzi[i];
      } else { // contiene i tag
        n++;
        elabor(n, pezzi[i]);
        n++;
      }
    }
    ...
    
    function elabor(c,str1) {
      a[c] = new Array(2)
      ... qui occorre estrarre quello che ti interessa (anche mediante RegExp), 
      salvare il numero in a[c][0] e il resto in a[c][1]
    }
    Ciao
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    L'idea non è malvagia ma il prblema è che in realtà la complessità è maggiore di quello che è detto.
    Tra i tag di tipo selection potrebbero esserci altri tag contenenti formattazioni html e poi potrebbe anche esserci più di una parola e quindi degli spazi.
    A questo punto la complessità dei criteri di ricerca sarebbe elevatissima!
    Non so come fare!

    Dovrei riuscire ad esplodere il testo in base a questi campi:

    <selection type=\"1\">piccolo</selection>

    per fare ciò dovrei passare alla funzione split un regExp (se possibile) del tipo

    ^<selection type=".">.*</selection>.

    Dopo di che dovrei poter anche estrarre i valori dell'attributo 'type' e il valore del tag selection (qualsiasi cosa contenga) e avere il tutto in maniere ordinata nell'array.
    L'idea potrebbe funzionare ma non so come fare.
    :master: :master: :master:
    http://www.beavermag.it

  4. #4
    Utente di HTML.it L'avatar di willybit
    Registrato dal
    May 2001
    Messaggi
    4,367
    Ciao biamat (e naturalmente ciao Mich_ )

    ho fatto delle prove... credo/spero che questo possa andare bene
    codice:
    <script language="javascript">
    function prova(stringa){
    	var re = /<selection type="([^"]+)">([^<]+)<\/selection>/i
    	var inizio=0
    	var fine=0
    	var arr = new Array()
    	
    	do{
    		iniziotag = stringa.indexOf('<selection type=',inizio)
    		if(iniziotag>=0){
    			finetag = stringa.indexOf('</selection>',iniziotag)+'</selection>'.length
    			arr[arr.length] = stringa.substr(inizio,iniziotag-inizio)
    			ris = re.exec(stringa.substr(inizio))
    			if(ris){
    				arr[arr.length]=[ris[1],ris[2]]
    			}
    			inizio = finetag
    		}
    		else{
    			arr[arr.length] = stringa.substr(inizio)
    			inizio = -1
    		}
    	}while(inizio>=0)
    	return arr	
    }
    
    //FACCIAMO UN TEST
    stringa = 'Il <selection type="1">piccolo</selection> Giovanni stava un giorno a osservare il <selection type="1">nuovo</selection> buco di talpa, che c\'era nel giardinetto dietro casa. La talpa di <selection type="2">questo</selection> buco buttava fuori una <selection type="1">gran</selection> quantità di terriccio <selection type="1">fresco</selection> e spiava il ragazzino. '
    mioArray = prova(stringa)
    
    txt = ''
    for(i=0;i<mioArray.length;i++)
    	if(typeof(mioArray[i])=='string')
    		txt+=mioArray[i]+'
    \n'
    	else
    		txt+=mioArray[i][1]+'(type='+mioArray[i][0]+')
    \n'
    document.write(txt)
    </script>
    facce sape'

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Capisco l'approccio di Willy, ma non sono molto d'accordo. Se cambia leggermente la sintassi (tipo spazi in piu`) e` molto vulnerabile, mentre un approccio tipo parsing e` (a mio parere) piu` robusto.

    (Willy, non e` una critica, ma uno spunto di discussione!)


    Pero` ora ho una domanda per biamat.
    Ma devi proprio farlo in JS sul client?
    Non e` che potresti usare uno strumento diverso (chiaramente sul server)? Ci sono strumenti molto piu` efficienti per fare il parsing di testi!

    Ciao
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  6. #6
    Ciao,
    la stringa su cui io devo lavorare è il risultato di un parsing di un file XML effettuato tramite php. Queste stringhe sono dei campi CDATA che possono contenere dei tag HTML.
    Cmq ho risolto il problema cambiando totalmente l'approccio con cui affrontare questo problema.
    Siete stati lo stesso preziosissimi.
    http://www.beavermag.it

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    siccome non ho resistito, ho provato a risolvere il tuo problema con le RegExp, anche se non ti serve più te lo posto ugualmente:

    codice:
    //testo d'esempio
    testo="Il <selection type=\"1\">piccolo<\/selection> Giovanni stava un giorno a osservare il <selection 
    
    type=\"1\">nuovo</selection> buco di talpa, che c'era nel giardinetto dietro casa. La talpa di <selection 
    
    type=\"2\">questo</selection> buco buttava fuori una <selection type=\"1\">gran</selection> quantità di terriccio <selection 
    
    type=\"1\">fresco</selection> e spiava il ragazzino."
    
    
    
    // RegExp
    re = /([\w\s]*)<selection[\w\s="']*type=\"(\d)\"[\w\s="']*>(\w*)<\/selection>/gi
    
    AR = new Array();
    while(R = re.exec(testo)){for(var i=0;i<R.length;i++) AR[AR.length]=R[i];}
    
    //verifica
    str=""
    for(i=0;i<AR.length;i++){str+=i%4?AR[i]+"\n":"";}
    alert(str);
    ciauz
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.