Newsgroup: it.comp.www.php
Titolo: modificare stringa se presente dei numeri

"arts 4, tested 4, passenger 2"
 
"arts 4, tested 4, passenger 2, arrived 2"
 
"arrived 2, tested 4, passenger 2, arts 4"
 
 
stringhe del genere come si puo' modificare in modo che si abbia solo
le parole con il 4 alla fine
 
 
quindi 
"arts 4, tested 4"
primo passaggio che toglie le parole seguite dal 2
e poi ripulisce la stringa per avere
"arts, tested"
 
e se con regex soluzione anche piu' veloce 

le parole con il 4 alla fine
 
Suggerirei di splittare in token usando
 
	explode(', ', $string);
 
e poi filtrare l'array cosi' ottenuto con una regexp.
 
Oppure puoi fare un match-all con
 
	(\w+) 4
 
    preg_match_all('#(\w+) 4#', $string, $gregs);
    $want = $gregs[1];
 
...$want e' l'elenco che cerchi.
 
Leonardo
 
-- 
What would'st thou do, my squire so gay, that rides beside my reine
Were ye Glenallan's Earl this tide, and I were Roland Cheyne?
To turn the rein were sin and shame, to fight were wondrous peril:
What would ye do now, Roland Cheyne, were ye Glenallan's Earl?

 e se con regex soluzione anche piu' veloce 
 
a piacere aggiungere punteggiatura vedi in fondo !;.,:?
 
 
Io spezzerei la stringa in un array associativo, poi filtrerei il valore 
che mi interessa e riassemblerei il tutto.
 
Probabilmente è più oneroso che con la regex (ma andrebbe esaminato il 
motore delle regex) e mi sembra più leggibile. Qualcosa come:
 
function valueIsFour($item) {
   return (4 == $item); }
 
array_filter(
   explode(
      trim(
         explode($stringa,',')),' '),"valueIsFour" );
 
 
Poi riunisci con un foreach perché implode() e array_map() non usano o 
ricevono la chiave dell'elemento.

 ...$want e' l'elenco che cerchi.
 
con questo
$string="arts color bb 4, tested well 4, passenger 2, arrived 2";
preg_match_all('#(\w+) 4#', $string, $gregs);
$want = $gregs[1];
print $want;  
 
da solo un array del tipo
Array ( [0] => bb [1] => well )
e con le parole non complete
 
come si fa al print avere invece arts color bb, tested well

e con le parole non complete
 
Perche' hai cambiato i requirement in corsa. Prima hai chiesto "parole" e hai
dato un esempio con le parole, adesso stai chiedendo delle FRASI :-)
 
E quindi deve cambiare la regexp:
 
        $string = "arts color bb 4, tested well 4, passenger 2, arrived 2";
        preg_match_all('#(\w[\w\s]*) 4#', $string, $gregs);
        $want   = implode(', ', $gregs[1]);
 
        print $want;


ok perfetto
grazie
 
� possibile farla funzionare anche con frasi tipo L'aquila
 
 
$string="L'aquila 4, arts color bb 4, tested well 4, passenger 2, arrived
2";
 
ora da come risultato 
"aquila, arts color bb, tested well"

2";
 
Si', basta che tu aggiunga i caratteri che vuoi gestire nella regexp.
 
In questo momento per il sistema una "frase" e'
 
	\w[\w\s]*
 
ovvero una lettera (\w), seguita da un numero indeterminato (*) di lettere
(\w) o spazi.
 
Unica cosa: il carattere "-", se lo vuoi aggiungere, va per ultimo perche'
definisce un range ("0-9" significa "da zero a nove" e non "i caratteri 0,
9, e trattino"), il punto va 'escapato' (quindi "\.", non ".", perche' "."
significa "qualunque carattere, specialmente quelli che non vuoi"), e poi,
gia' che ci sei, potresti dare uno sguardo alla sintassi delle regexp, sul
manuale ;-)


ok nuovamente grazie anche per la spiegazione sintetica e chiarissima
 
per avere anche ' . e - va scritto quindi in tale modo:
preg_match_all('#(\w[\w\s\.\'\-]*) 4#', $string, $gregs);
 
e questa x metterci anche accentate
preg_match_all('#(\w[\w\s\�\�\�\�\�\.\'\-]*) 4#', $string, $gregs);
 
per il _ invece non serve aggiungere altro
 
i cancelletti inzio e fine significa la stringa da cercare?

i cancelletti inzio e fine significa la stringa da cercare?
 
Si', sono i delimitatori della sequenza. Puoi usare qualunque carattere ed e'
"tradizionale" usare la barra "/". Pero' quel carattere poi non lo puoi usare
piu' nella sequenza senza escaparlo prima.
 
E, dato che a me a volte la barra serve, mentre il cancelletto molto meno, ho
l'abitudine di usare il cancelletto :-D


Il Wed, 06 Feb 2013 00:58:53 +0100, Leonardo Serni ha scritto:
 
$string="tested-x 4,L'aquila 4, passenger 2, arrived 2, a.jhjhj.rts color
4, te_ry4e_ll 4, pas44nger 2, arrived 2, arts color bb 4";
 
 
volendo usare l'altra soluzione
 
 
$arr=explode(', ', $string);
 
siccome ho
Array ( [0] => tested-x 4 
        [1] => L'aquila 4 
        [2] => passenger 2 
        [3] => arrived 2 
        [4] => a.jhjhj.rts color 4 
        [5] => te_ry4e_ll 4 
        [6] => pas44nger 2 
        [7] => arrived 2
        [8] => arts color bb 4 ) 
 
 
qual'� la soluzione piu 'veloce' poi per trasformare tale array in uno 
togliendo gli elementi che finiscono con spazio2
e ricreare togliendo spazio4 alla fine?
 
Array ( [0] => tested-x 
        [1] => L'aquila 
        [2] => a.jhjhj.rts color 
        [3] => te_ry4e_ll 
        [4] => arts color bb) 
 
 
Volevo vedere, ciclando la soluzione precedente con questa se ci sono
differenze in termini di velocit�
 
curisit�, ipotizzando che una sia piu' veloce significa anche che impiega
meno risorse fisiche (cpu e ram) per funzionare oppure puo' impiegare meno
tempo ma richiesta di piu' ram e cpu?

 puo' impiegare meno tempo ma richiesta di piu' ram e cpu?
 
In genere è proprio quello che succede.

 In genere � proprio quello che succede.
 
intendevo
 dire
es ipotizziamo che le 2 soluzioni impieghino lo stesso tempo, l'uso di cpu
e ram � identico?
oppure una soluzione x fare lo stesso lavoro 'si prende' maggiore cpu o
ram? tutte e 2 impiegano 5 secondi ma ad una gli serve 200mb di ram invece
che 50mb (giusto per fare un esempio pratico)
 
 
 
 
 
 
 
 
 
 
 

tempo ma richiesta di piu' ram e cpu?
 
Normalmente a parita' di tecnologia il prodotto tempo*risorse e' uguale,
per cui se diminuisci il tempo aumenta la RAM.
 
Passando da regexp a funzioni array, dipende da come sono implementate -
una macchina a stati ben congegnata va piu' veloce usando meno risorse.
 
Infatti il prodotto vero e': "astuzia * tempo * risorse = costante" :-)
 
Spesse volte, se invece di ottimizzare a bucoperso uno riguarda per bene
l'algoritmo e lo ripensa, vengono fuori incrementi di velocita' anche di
cinque o sei ordini di grandezza (no, non sto scherzando. BTDTGTTS).
 
Ovviamente per tirare fuori un algoritmo furbo paghi in tempo, studio, e
rischio che alla fin fine un algoritmo piu' furbo non esista. TANSTAAFL.
 
Leonardo che oggi pratica sconti sugli acronimi
