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