Perche non costituisci la stringa cosi ?
$str = " ... "."[var ".alg("[/T=var]")."]"." ... "."[var1 ".alg("[/T=var1]")."]" ecc.
Di sicuro se non hai un delimitatore o un numero di caratteri fisso la vedo dura.
Perche non costituisci la stringa cosi ?
$str = " ... "."[var ".alg("[/T=var]")."]"." ... "."[var1 ".alg("[/T=var1]")."]" ecc.
Di sicuro se non hai un delimitatore o un numero di caratteri fisso la vedo dura.
Ridatemi i miei 1000 posts persi !!!!
Non serve a nulla ottimizzare qualcosa che non funziona.
Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr
Avevo pensato di cambiare la stringa.. ma, in realtà pensandoci il delimitatore c'è, solo che non è mai lo stesso;
pensando tra me e me, sono arrivato alla conclusione che si puo fare anche con il tipo di STR che avevo proposto io, solo che il problema diventa di tipo logico.. non so come agire..
più che altro non vorrei cambiare tipo di stringa perchè si tratta di prendere la stringa da un file, e come ben sai aumentando la lunghezza del file, si aumenta anche la lentezza dello script..
Studiando ancora più a fondo pensavo di agire cosi:
prendiamo una stringa facile da analizzare
str = "1 3 6 4 8";
8 rappresenta alg(var)
4 è il value da prendere
6 rappresenta alg(var2)
3 il value di 6
1 rappresenta alg(var3)
Noi conosciamo la lista dei vari alg (*), quindi sappiamo che "8 6 1" sono i nostri delimitatori.
siccome a noi serve il valore 4, appartenente a 8 , basta capire quale delimitatore è più vicino a 8, e di conseguenza eliminarlo con un explode (in modo che si elimino anche le altre cose che non servono). Ma come facciamo a capire quale delimitatore è piu "vicino" a quello che ci interessa?!
Un delimitatore è qualcosa di fisso. Serve appunto a delimitare dati variabili.
Nel tuo caso anche se sai qual'é non lo sai riperire quindi non é un delimitatore. Nel tuo caso penso che potresti avere str = "1 3 6 8 8".
Se non vuoi aumentare la taglia del file puoi forse farne 2. Il primo per lo scopo iniziale (non so quale) e il secondo per questo problema.
Ridatemi i miei 1000 posts persi !!!!
Non serve a nulla ottimizzare qualcosa che non funziona.
Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr
Dai riapro un'altra discussione cosi che possano leggere tutti, perchè in via "teorica" senza modificare tutto si puo fare lo stesso![]()
E fare un secondo file ci hai pensato ?
Ridatemi i miei 1000 posts persi !!!!
Non serve a nulla ottimizzare qualcosa che non funziona.
Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr
Ma sta sintassi da cocainomani per le stringhe di testo chi l'ha pensata? L'esercizio o parliamo veramente di un caso di programmazione reale?
IP-PBX management: http://www.easypbx.it
Old account: 2126 messages
Oldest account: 3559 messages
La cosa migliore è cambiare il file...così l'unica soluzione potrebbe essere questa, ma credo che sia , molto più lenta rispetto a cambiare il file.
Diciamo che hai una stringa così fatta:
$str = blablablaABCDbbbaaaABEF_BAFEvvvvvEEBB
Dove le parti in grassetto sono i tuoi alg()
Se non ho capito male tu hai un alg(var) ed una lista di alg(*)
es:
$alg = ABEF
$algs = {ABCD, ABEF, EEBB, BAFE, ABEF} //Con l'odine che può differire da quello della stringa
In questo caso tu vorresti riprendere "bbbaaa".
Quindi dovresti fare:
Non l'ho testato, ma credo che forse dovresti rivedere gli indici $start ed $end per i casi particolari (tipo se alg(var) è il primo e non c'è la parte a sx).Codice PHP:
$end = strpos($str, $alg, 0);
$start = 0;
$key = -1;
foreach($algs as $k => $a){
if($a == $alg) continue;
$tmp = strpos($str, $a, 0);
if($tmp !== FALSE && $tmp < $end && $tmp >= $start ) {
$start = $tmp;
$key = $k;
}
}
if($key != -1){
$start += strlen($algs[$key]);
}
echo substr($str, $start, $end-$start);
Cmq, ti consiglio di rivedere la struttura della stringa...
Mi hai illuminato..Originariamente inviato da boots
La cosa migliore è cambiare il file...così l'unica soluzione potrebbe essere questa, ma credo che sia , molto più lenta rispetto a cambiare il file.
Diciamo che hai una stringa così fatta:
$str = blablablaABCDbbbaaaABEF_BAFEvvvvvEEBB
Dove le parti in grassetto sono i tuoi alg()
Se non ho capito male tu hai un alg(var) ed una lista di alg(*)
es:
$alg = ABEF
$algs = {ABCD, ABEF, EEBB, BAFE, ABEF} //Con l'odine che può differire da quello della stringa
In questo caso tu vorresti riprendere "bbbaaa".
Quindi dovresti fare:
Non l'ho testato, ma credo che forse dovresti rivedere gli indici $start ed $end per i casi particolari (tipo se alg(var) è il primo e non c'è la parte a sx).Codice PHP:
$end = strpos($str, $alg, 0);
$start = 0;
$key = -1;
foreach($algs as $k => $a){
if($a == $alg) continue;
$tmp = strpos($str, $a, 0);
if($tmp !== FALSE && $tmp < $end && $tmp >= $start ) {
$start = $tmp;
$key = $k;
}
}
if($key != -1){
$start += strlen($algs[$key]);
}
echo substr($str, $start, $end-$start);
Cmq, ti consiglio di rivedere la struttura della stringa...
E siccome sono cosi incapace a leggere il tuo script, ne ho creato uno sulla tua falsa riga, penso che il ragionamento sia lo stesso
Funziona con qualsiasi numero di delimitatori, qualsiasi sia la sua lunghezza, qualsiasi lunghezza del valore e non devo gestire l'eccezione se il delimitatore è primo o ultimo.Codice PHP:
$str = "1[/T=tu]7dsa[/T=tot]78[/T=titi][/T=tatas]6666sd[/T=t]";
$delimiters = array("[/T=tu]","[/T=tot]","[/T=titi]","[/T=tatas]","[/T=t]");
$delimiter = "[/T=t]";
$mul = 0;
function finding($str, $delimiters, $delimiter){
$mul = 0;
foreach($delimiters as $key=>$value) {
$pos[$value] = strpos($str,$value,0);
}
asort($pos);
$delimiters = array();
foreach($pos as $key=>$value) {
$delimiters[] = $key;
}
foreach($delimiters as $key=>$value) {
if ($value == $delimiter){
$algs_l[0][$delimiter] = strpos($str,$value,0);
$algs_l[0]["count"] = $mul-1;
$algs_l[1][$delimiter] = strlen($value);
}else{
$algs_l[0][] = strpos($str,$value,0);
$algs_l[1][] = strlen($value);
}
$mul++;
}
$start = $algs_l[0][$algs_l[0]["count"]]+$algs_l[1][$algs_l[0]["count"]];
$end = $algs_l[0][$delimiter]-$start;
return substr($str,$start,$end);
}