Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1

    RegExp e replace, bizzarro su IE < 5.5 , Safari ed altri

    codice:
    <script>
    function c(c){return {a:"1",b:"2"}[c]};
    alert("a b".replace(/[a-z]/g, c));
    </script>
    in rete c'è poco niente (nulla per risolvere), sta di fatto che in IE5 e mi sembra anche in Safari questo codice non produce una alert con scritto

    codice:
    1 2
    in FireFox, tutti, Opera, tutti, IE5.5, IE6, IE7 beta 2 ... il problema non sussiste.

    In IE5 torna tutta la funzione in stringa ...

    Qualche info a riguardo ?

    Grazie
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Forse stai usando qualcosa non presente nelle prime implementazioni di JS.

    Il fatto di poter inserire una funzione nel secondo termine del replace, potrebbe non essere presente in versioni JS (o meglio Jscript) precedenti alla 1.2.

    Dovresti controllare nei rispettivi siti, se tale particolarita` e` implementata.
    Per Safari dovresti trovare: e` un browser piuttosto recente.
    Per IE, invece, la politica di Microsoft e` di non supportare le versioni obsolete: secondo lei i browser vecchi andrebbero eliminati (compreso l'hw che li supporta); per questo sara` difficile trovare tali info.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3

    Re: RegExp e replace, bizzarro su IE < 5.5 , Safari ed altri

    Originariamente inviato da andr3a
    codice:
    <script>
    function c(c){return {a:"1",b:"2"}[c]};
    alert("a b".replace(/[a-z]/g, c));
    </script>
    in rete c'è poco niente (nulla per risolvere), sta di fatto che in IE5 e mi sembra anche in Safari questo codice non produce una alert con scritto

    codice:
    1 2
    in FireFox, tutti, Opera, tutti, IE5.5, IE6, IE7 beta 2 ... il problema non sussiste.

    In IE5 torna tutta la funzione in stringa ...

    Qualche info a riguardo ?

    Grazie
    non ho ie5 a portata di mouse ma hai provato a cambiare o il nome della funzione o del parametro?
    magari usare sempre c gli fa confusione

  4. #4
    Originariamente inviato da Mich_
    Forse stai usando qualcosa non presente nelle prime implementazioni di JS.
    già


    Originariamente inviato da Mich_
    Il fatto di poter inserire una funzione nel secondo termine del replace, potrebbe non essere presente in versioni JS (o meglio Jscript) precedenti alla 1.2.
    infatti torna un banale toString del costruttore ... però qualcosa non torna ...

    codice:
    alert("a b".replace(/([a-z])/g, (function(a){return '['+a+']';})('$1')));
    // [a][ b]
    
    alert("a b".replace(/([a-z])/g, (function(a){var o = {a:"1",b:"2"}; return o[a];})('$1')));
    // undefined undefined
    come puoi vedere la funzione è accettata, ma solo in un certo modo, lo scope della variabile inizia ad esistere dopo l'assegnazione ... na cosa dell'altro mondo, imho
    (accade anche in firefox questo ... quindi passare alla funzione a mano non è una soluzione)





    Originariamente inviato da kentaromiura
    magari usare sempre c gli fa confusione
    ma vai a bere va
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    dimenticavo, il rompi capo più bello è questo (con tutti i browsers)
    codice:
    alert("a b".replace(/([a-z])/g, (function(a){alert('['+a+']'); return '['+a+']';})('$1')));
    // [$1]
    // [a][ b]
    :maLOL:



    [edit]
    siccome lo fa con tutti i browsers, non è questa la soluzione, l'altra (la prima) va più che bene ma vorrei sapere come poter risolvere in IE 5
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    cosi' non va?

    codice:
    alert("a b".replace(/([a-z])/g, (function(){return c})('$1')));

  7. #7
    Originariamente inviato da kentaromiura
    cosi' non va?

    codice:
    alert("a b".replace(/([a-z])/g, (function(){return c})('$1')));
    chiaro che no, cmq ho risolto con un abominio inutile e spreca risorse ... però ho risolto il mio problema
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8

    RegExp su replace con chiamata a funzione ? Ecco come ho risolto

    Come già detto IE5, e probabilmente altri browser, non permettono di modificare in replace
    attraverso una funzione.

    Con una semplice stringa come "0123456789" non è quindi possibile fare
    un replace tipo questo:
    codice:
    replace(/([0-9])/g, function(num){return Number(num) + 1}));
    permettendo al codice di incrementare di 1 i vari numeri ("12345678910").

    Mettendo una variabile pre dichiarata al posto della funzione in linea il risultato non cambia, IE5 darà sempre un undefined o un risultato diverso da quello atteso.
    Questo limite è estremamente fastidioso poichè ci costringe a ricorrere a chissà quali mostruosità per fare un'operazione tanto banale quanto utile (magari più in generale che in questo singolo caso).

    La soluzione adottata da altri è stata quella di parsare con alternative la strina quando il browser era in grado di restituire true a questa espressione: ''.replace(/^/,String), vera in IE5 e falsa su FireFox, IE5.5, IE6 ed altri browser più moderni.

    Questo però non assicura, se non attraverso scrupolosi controlli, di ottenere lo stesso risultato poichè non è detto che la sequenza da modificare sia sempre così semplice ... ed ecco che erano nati i miei problemi, motivo di questo 3D.

    Non contento di dover usare due metodi differenti e potenzialmente con risultati diversi a seconda del browser ho cominciato a testare un pò di codice e ... cosa ne è venuto fuori ?
    La logica è che bisogna parsare una stringa, quindi si potrebbe anche modificare tale stringa in modo tale da poterla riparsare con una funzione di valutazione codice (eval) ... e siccome questo è sempre possibile, perchè non raggirare il problema proprio in questo modo ?

    Ecco l'esempio pratico, sicuramente più esplicativo di questo moi blaterare
    codice:
    // funzione per incrementare di uno
    function incrementaDi1(numero) {
    	// casting non necessario in questo caso
    	// [leggere poi per capire perchè]
    	return numero + 1;
    }
    
    // stringa da modificare
    var stringa = "0123456789";
    
    // riassegnazioe stringa
    stringa =
    	// costruisco un array fittizio sotto forma di stringa
    	'["' +
    	
    	// effettuo un replace continuando a creare l'array stringa fittizio
    	// sfruttando il nome della funzione. Essendo il valore $1 modificato
    	// dalla regexp in questo caso come numero, non è necessario
    	// usare un casting, mentre avessi dovuto parsare una stringa
    	// avrei dovuto scrivere nomeFunzione("$1")
    	stringa.replace(/([0-9])/g, '",incrementaDi1($1),"') +
    	
    	// chiudo l'array fittizio con metodo join su spazio vuoto
    	// al fine di poter riassegnare questa stringa come tale
    	// una volta valutata dal codice
    	'"].join("")';
    
    
    // a questo punto ho una stringa fatta in questo modo
    // ["",incrementaDi1(0),"",incrementaDi1(1),"",incrementaDi1(2),"",...].join("")
    
    
    // non mi resta che riassegnarla a se stessa valutata
    stringa = eval(stringa);
    document.write(stringa); // 12345678910
    Tutto questo poteva essere fatto in linea semplicemente così
    codice:
    stringa = eval('["'+stringa.replace(/([0-9])/g,'",(function(n){return n + 1}($1)),"')+'"].join("")');
    o in questo specifico caso ancora più semplicemente così:
    codice:
    stringa = eval('["'+stringa.replace(/([0-9])/g,'",($1+1),"')+'"].join("")');

    Approfondimento:
    Ricreare l'array fittizio rimesso a stringa dal join piuttosto che scrivere un semplice '+' per ogni porzione di stringa è un must per le prestazioni.
    Concatenare stringhe chilometriche è infatti un'operazione dispendiosa in termini di calcoli, memoria e stress per i PC meno potenti, mentre l'utilizzo di un array semplifica notevolmente questa procedura.

    Sebbene in questo esempio abbia usato solo dei numeri questo modo universale di usare una funzione in replace può richiedere diversi accorgimenti.
    Primo tra tutti i backslash, da aggiungere se necessario nella stringa da modificare poichè se ci fosse un solo carattere quote " al suo interno
    la creazione dell'array risulterebbe errata
    ["a","b",""","c"].join("") => errore
    Allo stesso modo se l'espressione prevede il recupero del carattere quote, la funzione potrebbe essere chiamata in questo modo
    modificaStringa("ab"c")
    generando inevitabilente un errore.

    Per evitare problemi con il primo caso io ho sfruttato questo ulteriore replace in fase di parsing
    stringa.replace(/(\\|"|')/g,'\\$1').replace(...
    che dovrebbe eliminare a sua volta anche il secondo problema restituendo alla funzione qualcosa tipo
    modificaStringa("ab\"c")

    Sicuramente un 3D prolisso, spero utile a quanti abbiano inciampato in questa problematica





    [edit]
    attendo conferma dagli utilizzatori di Safari ... ma visto la semplicità della soluzione dubito ci siano problemi
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #9
    aò ... v'ho universalizzato il replace in funzione per qualunque browser, IE4 compreso e voi non mi fate nemmeno un commento ???


    ammazza o !!! ... speriamo che A List Apart o Dean Edwars sappiano apprezzare meglio di voi



    uno di questi bug storici è stato risolto : http://burstproject.org/tests/testbr...wser_bugs.html
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Se "universalizzare" vuol dire usare istruzioni deprecate, il tutto e` decisamente deprecabile ...

    Nota: la funzione eval() non funziona in qualche browser moderno.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

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.