View Full Version : [C#] Problema sostituzione di un carattere in una stringa
Buongiorno a tutti voi! :)
Non riesco a trovare un modo per risolvere il mio problema:
Ho una stringa un pò complessuccia... di preciso un URL...
string url = webBrowser.Url.ToString(), urlrem = "";
char[] chr = url.ToCharArray(); //alla posizione 111!
chr[111]++;
foreach (Char s in chr) { urlrem += s; }
webBrowser.Navigate(urlrem);
Praticamente, come da codice, prendo dal componente WebBrowser l'URL a cui è connesso, lo "smonto" (passatemela, dai :) ) in un array di char, incremento il carattere che mi serve (in quel caso mi serve per passare alla pagina successiva del documento in cui sto navigando), ricostruisco infine la stringa e navigo così alla pagina successiva! :cool:
Il fatto è che, quando arrivo alla pagina 9, quando deve passare alla 10, il char non lo contiene un numero a 2 cifre, e quindi mi mette il carattere ":" (quello che a detta sua è successivo al 9... :( )
Bene, ditemi un pò voi cosa ne pensate... come potrei fare a sostituire quel carattere specifico, con uno a 2 o più cifre?
Spero di essermi spiegato nel migliore dei modi, grazie! :fagiano:
Ma devi poter parsare una qualsiasi stringa Url o sai già di per certo che il numero pagina è alla posizione 111 ?
Prova a postare anche un esempio di Url da gestire...
Ma devi poter parsare una qualsiasi stringa Url o sai già di per certo che il numero pagina è alla posizione 111 ?
Prova a postare anche un esempio di Url da gestire...
Allora: io so per certo che il numero di pagina sta alla posizione 111... in TUTTI gli URL che ho da gestire... se la pagina andrà alla 10, allora il dieci si dovrà trovare nei caratteri 111 (1) e 112 (0)
l'URL è una cosa del genere: /docserver/getimage.aspx?file=35012009042400000000001001&page=9&scale=148
Il 9 (ossia la pagina), nell'URL completo che purtroppo non posso postare, si trova alla posizione 111...
Allora che bisogno c'è di creare un array di chars ?
Basta che tramite uno StringBuilder, o anche concatenando delle SubString pigli i primi 110 caratteri della stringa dell'url della pagina 1 ( che saranno immutabili ), poi prendi tutti i caratteri dalla 112 in poi, e infine costruisci i nuovi indirizzi in un modo simile a questo... :
Substring1 + numPagina.ToString() + Substring2;
Hmm... il fatto è che sono un niubbo della programmazione, non è molto che ho iniziato e lo StringBuilder lo conoscevo solo di nome, ma non sapevo come usarlo... su google ci sono esempi, ma tutti per sostituire un solo carattere.
Ora provo, grazie! :D
Nessun problema, una cosa del genere :
string S = "StringaPrecedente1StringaSeguente";
int posizione = 18;
StringBuilder nuovoUrl;
for (int i = 2; i <= 10; i++) {
nuovoUrl = new StringBuilder();
nuovoUrl.Append(S.Substring(0, posizione - 1));
nuovoUrl.Append(i.ToString());
nuovoUrl.Append(S.Substring(posizione, S.Length - posizione));
MessageBox.Show(nuovoUrl.ToString());
}
O anche senza StringBuilder :
string S = "StringaPrecedente1StringaSeguente";
int posizione = 18;
string nuovoUrl;
for (int i = 2; i <= 10; i++)
{
nuovoUrl = S.Substring(0, posizione - 1) + i.ToString() + S.Substring(posizione, S.Length - posizione);
MessageBox.Show(nuovoUrl);
}
"posizione" è la posizione in base 1 del carattere che identifica la pag. 1 dell'Url. Nel ciclo For creo gli Url successivi da pag. 2 a pag. 10. ;)
Kralizek
25-04-2009, 08:35
Io avrei fatto qualcosa tipo:
1) Ricerco il carattere "?".
2) Seleziono la sottostringa che inizia con il carattere successivo il "?"
3) Divido la stringa in array di stringhe usando il token "&"
Poi abbiamo due strade:
A)
4) Per ogni stringa nell'array la divido in una coppia di stringhe usando il token "="
5) Seleziono la coppia che ha come primo elemento la stringa "page" e restituisco il secondo elemento.
B)
4) Seleziono la stringa nell'array che inizia con "page"
5) Ricerco il carattere "="
6) Restituisco la seconda parte della stringa.
static void Main(string[] args)
{
string str = "/docserver/getimage.aspx?file=35012009042400000000001001&page=9&scale=148";
int pos = str.IndexOf("?");
string sub = str.Substring(pos + 1);
string retain = str.Substring(0, pos + 1);
string[] pairs = sub.Split('&');
Dictionary<string, string> dict = new Dictionary<string,string>();
foreach (string elem in pairs)
{
string[] kv = elem.Split('=');
dict.Add(kv[0], kv[1]);
}
Console.WriteLine(dict["page"]);
dict["page"] = "12";
var param = (from x in dict
select string.Format("{0}={1}", x.Key, x.Value));
string newstr = retain + string.Join("&", param.ToArray());
Console.WriteLine(newstr);
Console.ReadLine();
}
Questo è lo pseudo-codice tradotto. Ovviamente si può re fattorizzare per una migliore riusabilità del codice
MadJackal
25-04-2009, 09:18
Io avrei fatto qualcosa tipo:
1) Ricerco il carattere "?".
2) Seleziono la sottostringa che inizia con il carattere successivo il "?"
3) Divido la stringa in array di stringhe usando il token "&"
Poi abbiamo due strade:
A)
4) Per ogni stringa nell'array la divido in una coppia di stringhe usando il token "="
5) Seleziono la coppia che ha come primo elemento la stringa "page" e restituisco il secondo elemento.
B)
4) Seleziono la stringa nell'array che inizia con "page"
5) Ricerco il carattere "="
6) Restituisco la seconda parte della stringa.
Non si può semplicemente cercare la stringa "page=" e lavorare partendo da lì?
Salvando la parte precedente dell'url, e modificando quella successiva?
Dai ragazzi, :D ,dal momento che è nota e fissa la posizione del carattere che identifica la pagina 1, col semplice metodo delle Substring lo si fa con 1 riga di codice...
Grazie a tutti per i consigli ottimi! ;)
Alla fine ho usato il metodo di Kralizek, anche se abbastanza complicato :D
Grazie anche a te MarcoGG, ho provato in diversi modi, ma probabilmente sbaglio io da qualche parte, nella costruzione della stringa, perchè durante il debug, la pagina fino alla 10 funzionava bene, oltre mi diventava tipo 101... ma è un errore mio :(
Già che vi ho scomodato, vi faccio un'altra domanda... qualcuno ha idea di come sapere se la pagina correntemente visualizzata è una pagina di errore? (tipo URL non trovato e simili... quelle di IE in questo caso)... Grazie!
Grazie anche a te MarcoGG, ho provato in diversi modi, ma probabilmente sbaglio io da qualche parte, nella costruzione della stringa, perchè durante il debug, la pagina fino alla 10 funzionava bene, oltre mi diventava tipo 101... ma è un errore mio :(
Mamma mia, :doh: :D , ma bastava che mettessi 111 nella variabile "posizione".
Esempio, nella stringa Url che hai postato, il numero della pagina 1 è alla posizione 63, perciò :
string S = "/docserver/getimage.aspx?file=35012009042400000000001001&page=9&scale=148";
int posizione = 63;
string nuovoUrl;
for (int i = 2; i <= 20; i++)
{
nuovoUrl = S.Substring(0, posizione - 1) + i.ToString() + S.Substring(posizione, S.Length - posizione);
MessageBox.Show(nuovoUrl);
}
:D
LoL! non credo di essere così nabbazzo, la posizione so dove cambiarla tant'è che l'ho fatto anche nell'altro codice che uso ora :D
Il fatto è che le pagine non si fermano alla 10! fino alla 10 quel codice funzia, è dopo che non mi va più... quando vado oltre! Ma può essere che sono io a sbagliare :D anzi certamente! :stordita:
Rinnovo la richiesta... come potrei fare per vedere se la pagina mostrata è un pagina di errore?
Il fatto è che le pagine non si fermano alla 10! fino alla 10 quel codice funzia, è dopo che non mi va più... quando vado oltre! Ma può essere che sono io a sbagliare :D anzi certamente! :stordita:
No no. Funzia anche dopo la 10. Direi che funzia con qualsiasi numero intero di questo mondo. Prova a far girare il mio esempio e vedrai che non ci sono problemi. ;)
No no. Funzia anche dopo la 10. Direi che funzia con qualsiasi numero intero di questo mondo. Prova a far girare il mio esempio e vedrai che non ci sono problemi. ;)
Chiedo venia XD! Adesso appena riesco lo rifaccio girare e vedo!
Che stia rincoglionendo? :rolleyes:
Ciao! :)
Chiedo venia XD! Adesso appena riesco lo rifaccio girare e vedo!
Che stia rincoglionendo? :rolleyes:
Ciao! :)
Il fatto è che, come dici in prima pagina, tu vuoi estrarre tutte le volte il numero pagina dall'indirizzo del WebBrowser, il che non è assolutamente necessario. Bastava che estraessi una volta sola la Substring1 ( precedente ) e la Substring2 ( seguente ) e poi tenessi traccia separatamente del numero pagina... Che sò, se l'utente naviga "Avanti", lo incrementi di 1 e poi costruisci il nuovo Url, ecc...
Non so, per me è un problema dalla soluzione davvero elementare, senza nulla togliere alle proposte degli altri utenti, ovviamente.
Si ho capito cosa intendi... Ma dimmi una cosa... le "StringaPrecedente e StringaSeguente"... come le estraggo? faccio uno Split?
Il fatto è che finora non ho programmato molto nella mia vita XD
Apparte un pò di asm... :)
Kralizek
25-04-2009, 19:22
Il fatto è che, come dici in prima pagina, tu vuoi estrarre tutte le volte il numero pagina dall'indirizzo del WebBrowser, il che non è assolutamente necessario. Bastava che estraessi una volta sola la Substring1 ( precedente ) e la Substring2 ( seguente ) e poi tenessi traccia separatamente del numero pagina... Che sò, se l'utente naviga "Avanti", lo incrementi di 1 e poi costruisci il nuovo Url, ecc...
Non so, per me è un problema dalla soluzione davvero elementare, senza nulla togliere alle proposte degli altri utenti, ovviamente.
:Prrr:
Si ho capito cosa intendi... Ma dimmi una cosa... le "StringaPrecedente e StringaSeguente"... come le estraggo? faccio uno Split?
No, nessuna Split, è tutto nel codice che avevo postato.
Forse così è + chairo cosa intendo :
string urlPagina1 = "/docserver/getimage.aspx?file=35012009042400000000001001&page=1&scale=148";
int numPaginaCorrente = 1;
int posizione = 63;
string StringaPrecedente = urlPagina1.Substring(0, posizione - 1);
string StringaSeguente = urlPagina1.Substring(posizione, urlPagina1.Length - posizione);
//Navigo alla pagina successiva
numPaginaCorrente += 1;
string urlPag = StringaPrecedente + numPaginaCorrente.ToString() + StringaSeguente;
MessageBox.Show(urlPag);
//Navigo alla pagina 123
numPaginaCorrente = 123;
urlPag = StringaPrecedente + numPaginaCorrente.ToString() + StringaSeguente;
MessageBox.Show(urlPag);
//...
//...
Kralizek
26-04-2009, 09:03
ad occhio mi sembra che hai problemi ad estrarre pagine superiori alla 9.
Nel senso se hai l'url di pagina 12 e vuoi andare a pagina X. L'andare non è un problema, ma prendere il numero 12 può esserlo.
ad occhio mi sembra che hai problemi ad estrarre pagine superiori alla 9.
Nel senso se hai l'url di pagina 12 e vuoi andare a pagina X. L'andare non è un problema, ma prendere il numero 12 può esserlo.
Ma infatti :D , io estraggo le Substring che compongono l'Url una volta sola, all'inizio, partendo dall'Url "... page=1 ...", e memorizzo la pagina corrente in una variabile separata ( che potrebbe stare Private a livello del Form contenente il WebBrowser... ).
Per ogni ipotetica azione dell'utente ( pagina avanti / pagina indietro / vai a pagina X ... ) vado PRIMA a modificare la variabile numPaginaCorrente, e POI costruisco la stringa Url desiderata.
Perciò il mio è un metodo alternativo e drasticamente più semplice da gestire che non quello ipotizzato nel Post di apertura ( scomporre l'url in un array di Chars e ad ogni piè sospinto estrarre il numero pagina corrente e ricostruire da zero la nuova stinga Url... :doh: ).
Poi ragazzi, fate vobis, se vi piace lo stile U.C.A.S., accomodatevi... :D
Poi ragazzi, fate vobis, se vi piace lo stile U.C.A.S., accomodatevi...
:eek: What's "stile U.C.A.S.":confused:
Comunque ora ho capito... non avevo intuito bene come prendevi le SubStrings, dato che non le ho mai usate e appunto, non sapevo come funzionassero :oink:
Adè appena ho un attimo di tempo lo inserisco nel prog! Grazie per la tua disponibilità MarcoGG!
Ciau! :)
:eek: What's "stile U.C.A.S.":confused:
Comunque ora ho capito... non avevo intuito bene come prendevi le SubStrings, dato che non le ho mai usate e appunto, non sapevo come funzionassero :oink:
Adè appena ho un attimo di tempo lo inserisco nel prog! Grazie per la tua disponibilità MarcoGG!
Ciau! :)
:D U.C.A.S. = Ufficio Complicazioni Affari Semplici. :D
:D U.C.A.S. = Ufficio Complicazioni Affari Semplici. :D
:p :p LoL! :D
MarcoGG! Alla fine cel'abbiamo fatta! :D
Risolto col tuo metodo! :O
Ma ho dovuto cambiare alcune parti, altrimenti continuava a non funzionare, per il motivo che la variabile posizione, è un pò relativa come cosa ed è dipendente dal numero di pagina visualizzata... fino alla 10 appunto funziona tranquillamente, ma dopo le cifre della pagina diventano 2 e la posizione fissa non è più utilizzabile dato che tutta la stringa si allunga di 1 la costruzione alla fine risulta errata! :(
Grazie mi sei stato molto utile! Bye! :p
P.S.: ecco il codice come mi funziona ora:
void Avanti()
{
try
{
string urlPagina1 = webBrowserJournal.Url.ToString();
int posizione = 111;
string StringaPrecedente = urlPagina1.Substring(0, posizione);
string StringaSeguente = urlPagina1.Substring(urlPagina1.Length - 10, 10);
page++;
string urlPag = StringaPrecedente + page.ToString() + StringaSeguente;
webBrowserJournal.Navigate(urlPag);
toolStripTextBoxPage.Text = (Convert.ToInt32(toolStripTextBoxPage.Text) + 1).ToString();
}
catch { }
Noooooooo ! :D Non ci credo, sei riuscito a sbagliarla di nuovo. :cry:
Non è ancora quello che ti avevo consigliato io...
Io ti avevo detto di mettere una variabile numPaginaCorrente FUORI dai metodi "Avanti", "Indietro" ecc..", e di estrarre UNA VOLTA SOLA le stringhe Precedente e Seguente, ( partendo dall'Url della pagina 1 ) e metterle in 2 variabili sempre FUORI dai metodi... In questo modo potevi generare tutti gli Url del mondo ! :doh: :D
Va beh, niente dai, ci rinuncio... :cry: :D
Noooooooo ! :D Non ci credo, sei riuscito a sbagliarla di nuovo. :cry:
Non è ancora quello che ti avevo consigliato io...
Io ti avevo detto di mettere una variabile numPaginaCorrente FUORI dai metodi "Avanti", "Indietro" ecc..", e di estrarre UNA VOLTA SOLA le stringhe Precedente e Seguente, ( partendo dall'Url della pagina 1 ) e metterle in 2 variabili sempre FUORI dai metodi... In questo modo potevi generare tutti gli Url del mondo ! :doh: :D
Va beh, niente dai, ci rinuncio... :cry: :D
Daaaaiii ma oh va bene anche così :D
Ho capito cosa dicevi di fare porca miseria, ma quella è solo una parte del metodo Avanti... c'è tutto un altro pezzettone, ho semplicemente fatto copia incolla in tutti i posti in cui mi serviva :D :D
Poi non me ne frega niente se mi gestisce tutti gli URL del mondo, tanto io ho solo quelli! (x fortuna) :sofico:
Ho messo la variabile page come pubblica e la modifico a seconda delle mie esigenze dentro i vari metodi... :P
Non fartene una colpa, hai spiegato benone! :p
Non fartene una colpa, hai spiegato benone! :p
Ok. Sono contento che sia finita bene. ;) :D
Ok. Sono contento che sia finita bene. ;) :D
Non sai quanto a me! :D :D Grazie e ciaooo! :p
Io preferisco soluzioni piu' robuste, ovvero resistenti a piu' imprevisti possibile.
Se sono anche piu' leggibili meglio ancora. :)
public string GetNextPageURL(string InputUrl)
{
Uri url = new Uri(InputUrl);
string query = url.Query;
if (string.IsNullOrEmpty(query)) return string.Empty;
NameValueCollection queryCollection = HttpUtility.ParseQueryString(query);
string[] mypages = queryCollection.GetValues("page");
if (mypages.Length != 1) return string.Empty;
int nextpage = int.Parse(mypages[0]) + 1;
queryCollection.Set("Page", nextpage.ToString());
UriBuilder ub = new UriBuilder(url);
ub.Query = queryCollection.ToString();
string NewURL = ub.ToString();
return NewURL;
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.