Newsgroup: it.comp.lang.javascript
Titolo: Re: Stringhe lunghe e alert

 expression che sostituisce ascii 10/13 con uno spazio, per esempio).
Ciao, grazie !
Ci avevo pensato ma non sono riuscito a trovare la funzione adatta :/ Ho 
provato trim(), ma mi memorizza ugualmente su database la stringa con gli "a 
capo". Non ti chedo qual'č la funzione php altrimenti divento OT :))
-- 
=============== Totň alias J_Zanetti ================
                          Tessera #9 "Nel segno di Cruz"
  Tessera #0 #7 "ANDY SCHIET ZE ALLEMAAL" (fondatore)
============== toto...@SPAMtin.it =============== 

expression che sostituisce ascii 10/13 con uno spazio, per esempio).
Con "\n", cosi' si mantiene l'"a capo".
'bye

 Con "\n", cosi' si mantiene l'"a capo".
Mi sa perň che l'acapo non lo vuole, cosě a naso...
Attenzione anche a \r, nel caso (mi sa che se converti sia ascii 10 che 13
con \n rischi un doppio "a capo"; da verificare ma ricordo un qualcosa...)
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 terminazione".....come faccio a risolvere questo problema?
Io non ho ben capito...
se la prendi lato server vuol dire che hai registrato lato server questo "a
capo", corretto?
Se sì io risolverei lato server (con codice php una bella regular
expression che sostituisce ascii 10/13 con uno spazio, per esempio).
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

 capo". Non ti chedo qual'è la funzione php altrimenti divento OT :))
Più che altro non la so, ma le regular expression sono più o meno uguali
per tutti i linguaggi (escludendo quell'animale di c# che mi sta facendo
dannare).
in javascript sarebbe un qualcosa del tipo (come dicevo sto studiandole in
c#, spero di non scrivere un erroraccio) stringa=stringa.replace(/\n/g,"
").replace(/\r/g,""); //attenzione come dicevo sopra al doppio "a capo",
non ricordo bene la logica. 
In php sarà più o meno la stessa cosa, basta che ti cerchi la sintassi
corretta.
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

Salve sto scrivendo un'applicazione in cui devo mandare in output un alert 
contenente una stringa scritta dall'utente in una form (poi scritta e 
ripescata da  database).
Il codice è generato dinamicamente (php) e succede spesso che se l'utente 
scrive una frase lunga e preme il tasto invio, la frase va a capo. Risultato 
il codice risultatnte fornisce codice del tipo:
alert('oggi è lunedi.
domani andiamo in centro?');
Il che non fa partire l'alert dando l'errore "stringa senza 
terminazione".....come faccio a risolvere questo problema?
-- 
=============== Totò alias J_Zanetti ================


 ricordo proprio.
Fammi sapere.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 9 hours, 11 minutes and 6 seconds ago.
on air ~ "Maki Kimura - Beyond The Bounds"

 'originale'.
Leggi su.
E cmq e' buona norma evitare di modificare i dati in base ad una loro
specifica rappresentazione; che e' ben diverso dal volersi proteggere da
sql injection.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 6 hours, 38 minutes and 26 seconds ago.
on air ~ "Greenday - When I Come Around"

 Probabilmente mi ero fissato su questa soluzione,
IMVHO, non e' propriamente una soluzione al contesto che hai. Se anche tu
avessi scritto una regexp che si fosse comportata come volevi, non avresti
avuto lo stesso problema che ti ho citato nel post precedente?
Se lo scopo che ti prefiggi e' "eliminare il name da un tag form" e' bene
scrivere una regexp che includa queste direttive. Ovvero il tag form, e
l'attributo name dello stesso. Cosi' eviti di cadere in qualche
incongruenza.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 10 hours, 29 minutes and 4 seconds ago.
on air ~ "The Ordinary Boys - Over the Counter Culture"

 capo".
La cosa corretta non e' modificare i dati prima che vengano salvati su DB.
Va benissimo lasciare le stringhe con "gli a capo", in quanto tu vuoi solo
cambiare il modo in cui essi vengono rappresentati a schermo.
Metti caso che un domani tu voglia visualizzarli in una textarea, o in un
div, piuttosto che in un alert javascript. Se modifichi direttamente i dati
sul DB per ottimizzare quest'ultima visualizzazione, ti troverai in
difficolta' negli altri casi.
E' sempre il solito discorso di tener separata la forma dal contenuto.
Quindi, salva pure i dati cosi' come sono. E modificali solo in fase di
visualizzazione.
Qualcosa tipo:
<script type="text/javascript">
	alert("<?=str_replace("\r\n","\\r\\n",$str)?>");
</script>
Dove $str e' ovviamente la stringa recuperata da DB.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 5 hours, 41 minutes and 32 seconds ago.
on air ~ "  INCOMPLETE   Donnie Darko - Ave Mariabd5960c4eb4b214cf8a0b0c619874c680021fe7200600000ac44000000b9"

 google :)
Dai un'occhiata anche a questa:
http://it2.php.net/addcslashes
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 6 hours, 54 minutes and 13 seconds ago.
on air ~ "Matrix Reloaded - Die, Die My Darling"

 stringadacercare="?<parteprima>(<form)+(name=.')(^'+)?<partedopo>(.+)(</form>)",
Va beh, dai, non mi pare tanto assurdo, anzi.. In questo modo puoi sia
utilizzare la classica sintassi alla quale sei abituato (con i numeri:
ovvero $1 diventa <1>.. del resto anche su PHP e' \\1), sia dare un nome
piu' significativo al match. Sempre che io abbia inteso correttamente la
sintassi.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 7 hours, 46 minutes and 33 seconds ago.
on air ~ "Gianluca Grignani - Che ne sarà di noi"

>> Console.WriteLine(r.Replace(s, "$1"));
Boh, mi sfugge come quanto sopra possa funzionare...come dicevo sono però
un po' arrugginito sull'argomento.
Non vorrei che il writer (che leggo per cancellare il name) aggiungeva
qualche altro carattere che non ricordo (il solito "animale" .net, anche se
gli tronchi il name, continua a metterlo; se glieli scrivi te a mano te lo
raddoppia...così occorre intervenire sull'oggetto che sta inviando al
browser il tag per modificarlo, in modo da intervenire dopo il rendering
del tag form...che però contiene anche tutto il render dei children
control).
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 parentesi tonde prendevano sempre "il più possibile".
Non e' una questione di "prendere il piu' possibile", perche' l'esempio che
porti te non corrisponde ai criteri del pattern. Se il pattern e' quello,
e' impossibile che mi prenda anche il name presente in pre. Per il semplice
fatto che non corrisponde al pattern.
Quel name si trova dopo almeno un carattere ">", nell'esempio fatto adesso
dopo due, mentre nella regexp che ti ho scritto gli ho detto che deve
trovarsi dopo una serie di caratteri diversi da >. In sostanza, tra "<form
" e "name='" puo' esserci quasivoglia carattere, ma non ">".
Quindi la regexp che hai scritto tu e' probabilmente diversa da questa.
Appena hai l'occasione, comunque, fammi sapere che sono curioso.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 9 hours, 36 minutes and 43 seconds ago.
on air ~ "The D4 - Come On!"

 qualche altro carattere che non ricordo
Questo puo' essere, non lo so. Partendo dal contesto che mi hai dato, io ho
cercato di darti una risposta adeguata.
Se mi vuoi dare l'esempio concreto gli do' un'occhiata.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 8 hours, 30 minutes and 12 seconds ago.


 Se mi vuoi dare l'esempio concreto gli do' un'occhiata.
Ce l'ho a casa. Non vorrei il casino nascesse proprio sul multiline, non
ricordo proprio.
-- 


con \n rischi un doppio "a capo"; da verificare ma ricordo un qualcosa...)
Per essere precisi le combinazioni dovrebbero essere "\n", "\r" e
"\r\a" per i vari OS. Sostituire prima l'ultima e poi le altre due.
Ad ogni modo la stringa in PHP non deve contenere "\n" come carattere
ma "\\n" in modo che poi la stringa Javascript abbia "xxxxx\nyyyy" e
non:
xxxxxx[carattere a capo]
yyyyy
Per essere precisi, dato che si tratta di PHP, sarebbe da usare
addslashes che gestisce tutto senza usare regex direttamente.
$outstring=addslashes($outstring);
echo "alert('$outstring');";
Da notare che questa "sostituzione di caratteri" andrebbe fatta prima
di inserire la stringa nel database e non all'output dopo averla presa
dal database o ci potrebbero essere rischi di sql injection.
'bye

 C'e' solo una sottostringa che corrisponde alla regexp che ti ho fatto.
Sě, forse sai cosa facevo?
un qualcosa del tipo "[^(name)]"; era in questo modo che mi beccava
l'ultima occorrenza (cioé la piů "larga", fino a name='p'></pre>) anziché
la prima. Anzi, sono quasi certo...
Resta la domanda: come dirgli "il primo name"? Ricordo che in javascript si
puň fare (anche se non ricordo la sintassi), mentre con c# non ero riuscito
a trovare la sintassi corretta.
Non mi č venuto in mente di risolvere come dici te, che risolve a monte il
problema...
Scusa per le inesattezze ma era un po' di tempo fa e mi sta tornando in
mente pian piano.
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

 DB, addslashes modifica anche gli a capo.
addslashes non mi modifica gli a capo; mette solo le slash prima degli 
apici....
nel mio script infatti non modifica la stringa e nel db viene memorizzata 
ancora con gli spazi
-- 
=============== Totò alias J_Zanetti ================


 Console.WriteLine(r.Replace(s, "$1"));
Quanto sopra, nelle prove che avevo fatto, sostituiva il name='i'> nel tag
input.
Perň avevo usato la sintassi ?<...> e non il $1.
E' di qualche settimana fa e quindi non ricordo esattamente tutte le prove
che avevo fatto, perň...


 dannare).
Ok, ora che ho capito la solzione che devo intervenire su php mi butto su 
google :)
grazie ancora!
ciao!
-- 
=============== Totò alias J_Zanetti ================


 Ops :-)
Forse ti sei confuso con addcslashes().
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 6 hours and 53 minutes ago.


 fino al "name='" (escluso).
Ok. E' qui che dico: form + n caratteri diversi da > +, subito dopo,
name='...', se la stringa fosse "bla bla <form
name='f'><pre>name='f'</pre></form>" cosa sostituisce?
Dovrebbe sostituire la prima occorrenza, mentre dalle mie prove in c# le
parentesi tonde prendevano sempre "il piů possibile".
Comunque hai sicuramente ragione te, č solo un ragionamento ad alta voce
proprio perché non ricordo esattamente tutte le sintassi.
-- 
"e mai che mi sia venuto in mente
 di essere piů ubriaco di voi
 di essere molto piů ubriaco di voi"
									  F.D.A.

 capo".
La cosa corretta non e' modificare i dati prima che vengano salvati su DB.
Va benissimo lasciare le stringhe con "gli a capo", in quanto tu vuoi solo
cambiare il modo in cui essi vengono rappresentati a schermo.
Metti caso che un domani tu voglia visualizzarli in una textarea, o in un
div, piuttosto che in un alert javascript. Se modifichi direttamente i dati
sul DB per ottimizzare quest'ultima visualizzazione, ti troverai in
difficolta' negli altri casi.
E' sempre il solito discorso di tener separata la forma dal contenuto.
Quindi, salva pure i dati cosi' come sono. E modificali solo in fase di
visualizzazione:
<script type="text/javascript">
	alert("<?=str_replace("\r\n","\\r\\n",$str)?>");
</script>
Dove $str e' ovviamente la stringa recuperata da DB.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 5 hours, 46 minutes and 41 seconds ago.


 dannare).
Ah si? Le usai una volta sola le regexp su C#, ma mi sembrava che fossero
sempre in sintassi perl. Cos'hanno che ti fanno dannare?
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 6 hours, 56 minutes and 53 seconds ago.


 mente pian piano.
Don't worry.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 9 hours, 52 minutes and 2 seconds ago.


ancora con gli spazi
Ok, allora devi trasformare gli a capo da singoli caratteri nella
stringa \n (ove \ e n sono due caratteri separati) con qualcosa del
tipo:
$count=0;
$search[$count]="/\r\n/"; 
$replace[$count++]="\\n";
$search[$count]="/\n/";
$replace[$count++]="\\n";
$search[$count]="/\r/";
$replace[$count++]="\\n";
$theText = preg_replace($search, $replace, $theText);
'bye

 che avevo fatto, però...
Beh, fammi sapere. Un test veloce mi conferma che il codice che ti ho
scritto funziona come ci si aspetta.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 8 hours, 18 minutes and 52 seconds ago.


difficolta' negli altri casi.
Basta usare stripslashes se serve riavere i dati nel formato
'originale'.
'bye

 sempre in sintassi perl. Cos'hanno che ti fanno dannare?
esempio pratico:
 string s="<form name='pippo'><input name='i'></form>";
Non sono riuscito manco morto a sostituire la *PRIMA* occorrenza di name
(voglio ottenere un <form><input name='i'></form> per modificare il tag
form e renderlo xhtml). Con qualsiasi sintassi che ho usato mi sostituiva
sempre il name presente in input.
Poi ho risolto in altro modo (sho spezzettato la riga usando l'opzione
multiline), però il problema è rimasto irrisolto.
Chiesto nel newsgroup italiano, nessuna risposta.
Per definire le "parti" da mantenere usa poi una sintassi assurda e
proprietaria che non ho sotto mano, era un qualcosa del tipo
stringadacercare="?<parteprima>(<form)+(name=.')(^'+)?<partedopo>(.+)(</form>)",
e sostituisci con $parteprima$partedopo...
La ho scritta malissimo perché non la ricordo a memoria ma la logica era
questa, solo che beccava sempre il name di input.


 inesistente.
Non e' per fare il "bastian contrario", ma non mi pare.. nel senso che gli
esempi che ti ho fornito or ora derivano proprio da una spulciata rapida
alla documentazione in questione :) (come ti ho detto, in .NET non ci
lavoro abitualmente, anzi) 
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 8 hours, 7 minutes and 50 seconds ago.
on air ~ "Green Day - Boulevard of Broken Dreams"

 lavoro), ma questo non ti funziona?
[CUT]
A vederlo direi di sì, ma il problema è "rimuovere il name dal tag form".
La stringa è un esempio per farti capire, ma potrebbe anche essere <img
name='a'><form name='..." <= e il semplice Replace ti frega.
Ho cercato il thread, il meglio che ero riuscito ad ottenere dopo 1/2
giornata di madonne e di test delle varie sottoclassi che ti mette a
disposizione era di usare una regex tipo
"(?<inizio>.+)name=\"([^\"].*)\"(?<fine>.+)"
e sostituirla con $<inizio>$<fine>.
Però quanto sopra mi sostituiva il secondo name.
Allora ci ho aggiunto un "multiline" tra le opzioni del costruttore e ha
magicamente funzionato (magicamente un paio di cippe: magicamente perché
costruendo il codice in code-behind mi va da solo a capo prima e dopo il
tag form iniziale...ma, in generale, il problema non è risolto).
Ho messo 3 messaggi nel newsgroup ma nessuno ha saputo rispondermi.
Ho trovato in rete sintassi che piazzano un ? anche dopo (es. ?<inizio>.+?)
ma non ho trovato documentazione su cosa serva. In generale la
documentazione msdn su regexp in 
asp.net
 è vergognosamente quasi
inesistente.


 meno che .NET non si comporti diversamente.
"(?<inizio>.+)name=\"([^\"].*)\"(?<fine>.+)"
Questa la stringa che usavo (scusa ma sono fuso, la avevo cercata e postata
prima): qualsiasi cosa seguita da name=" seguito da qualsiasi cosa che non
sia " + tutto il resto.
La domanda che mi ero posto era: perché prende l'intervallo piů grande?
Quella sopra dovrebbe essere la stringa di ricerca che uso attualmente, con
in piů solo il flag MultiLine che applica quanto sopra solo alla prima riga
(rimuovendo perň il multiline mi cancellava appunto l'ultimo name="..."
trovato). Che sostituisco poi con $<inizio>$fine .
Probabilmente mi ero fissato su questa soluzione, la tua risolve a monte il
problema.
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 name=\"(^\"]*\"
Forse ho trovato esempi sbagliati in giro (ricordo di esser partito da un
esempio trovato in rete, che usava addirittura .*? (e quel ? mi aveva
incuriosito e non avevo trovato da nessuna parte il significato; ma il
parser non segnalava errore e il risultato era il medesimo che si ottenva
rimuovendolo...)
[CUT]
Forse ero partito da una logica errata, come dici te, e mi ero fissato su
quella particolare sintassi (che davano come sintassi per sostituzioni),
quel ?<...>...
Stasera guardo, per l'intanto grazie.
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

 quel ?<...>...
E' una delle due sintassi che puoi usare. Serve a dare un descrittivo al
marker, da quanto ho potuto vedere; ma a parte cio' e' equivalente
all'altra a te familiare.
-- 
ZER0
~ The Tangent Universe collapsed 5951 days, 10 hours, 43 minutes and 49 seconds ago.
on air ~ "My Chemical Romance - I'm Not Okay (I Promise)"

 all'altra a te familiare.
Hai ragione (al solito)...
Erravo il tutto proprio concettualmente, nel senso che ragionavo pensando
al parametro della regexp NON come stringa da cercare, ma come TUTTA la
stringa...qua sotto la stringa che stavo usando (e che funzionava, ma con
il multiline e quindi per un "barbatrucco" schifoso), e ovviamente la tua
che funziona senza multiline:
	//string Find="(?<first>.+)name=\"[^\"]*\"(?<last>.*$)";
        string Find="(<form [^>]*)name=\"\\w*\"";
        Regex r=new Regex(Find);
        HtmlRender=r.Replace(HtmlRender,"$1",1);
Tra l'altro proprio stasera mi è capitato un bel img non validato per la
proprietà border. Dato che è numerica e non settabile a null ho usato la
stessa logica sopra con img e (ovviamente) funziona.
 
Grazie.


 Grazie.
Felice d'esserti stato d'aiuto :)
-- 
ZER0
~ The Tangent Universe collapsed 5952 days, 1 hours, 35 minutes and 26 seconds ago.