View Full Version : [PHP] strstr() non funziona come dovrebbe
PhoEniX-VooDoo
09-09-2008, 13:48
Ho un problema con la funzione strstr() la quale come saprete confronta due stringhe e restituisce la prima dopo il valore di confronto della seconda.
In sostanza, io ho in IMPUT questo file txt (è una "demo")
OPEN instruction-OPEN
STORE instruction-STORE
OPEN instruction-OPEN
OPEN instruction-OPEN
ed ho bisogno di visualizzare ciò che segue 'OPEN' per esempio, quindi faccio cosi:
$var3 = file("testo.txt");
foreach ($var3 as &$value) {
$res = stristr($value, 'OPEN');
if ($res <> ''){
print "<br>";
print $res;
}
}
però ottengo in OUTPUT
OPEN instruction-OPEN
OPEN instruction-OPEN
OPEN instruction-OPEN
mentre io mi aspetto (e voglio) solo "instruction-OPEN"
what's wrong? :muro:
matteo micanti
09-09-2008, 18:29
Il problema è che stristr() va verso destra, per cui prenderebbe i caratteri successivi a "open", mentre a te servono quelli precedenti.
Che io sappia non esiste una funzione per quello che vuoi fare, devi costruirne una personalizzata.
Puoi usare diversi modi, le vie più semplice che mi vengono in mente sono substr() e il rovesciare le stringa di partenza, cercare la stringa "open" al contrario e visualizzare il risultato rovesciandolo nuovamente.
Tutto questo con una combinazione di strrev().
Qualcosa del genere:
$righe = file ( 'testo.txt' );
foreach ( $righe as $riga ) {
$riga = strrev ( $riga );
if ( $res = stristr ( $riga , strrev( 'open' ) ) )
echo '<br />' , strrev( $res );
}
Altrimenti puoi usare un' espressione regolare.
Ciao!
PhoEniX-VooDoo
09-09-2008, 18:43
grazie del intervento prima di tutto.
ad ogni modo, a me i caratteri che servono sono infatti successivi a OPEN, in pratica io gli dico (usiamo i valori e non le variabili per chiarezza):
stristr('OPEN instruction-OPEN', 'OPEN');
Quindi cosa mi aspetto, che lui trovi alla posizione 0-1-2-3 'OPEN' e mi restituisca ciò che segue, ovvero 'instruction-OPEN'
matteo micanti
09-09-2008, 19:14
Ahhh, io avevo capito al contrario, che dovevi estrarre "OPEN instruction" :p
Bhè, strripos() la sua funzione la svolge correttamente, infatti prende la parte successiva alla stringa cercata includendo quest'ultima.
A questo punto ti basta usare substr() per prendere i caratteri successivi al 5° (dopo O,P,E,N,SPAZIO) dalla stringa restituita da strripos() (che comunque serve visto che devi prendere solo i valori che contengono OPEN escludendo quelli con STORE [anche se potrebbe essere sostituita con altre funzioni])
$righe = file ( 'testo.txt' );
foreach ( $righe as $riga ) {
if ( $res = substr ( stristr ( $riga , 'OPEN' ) , 5 ) )
echo '<br />' , $res;
}
O anche (è la stessa cosa) i successivi al 4° utilizzando ltrim() per togliere lo spazio rimanente a sinistra:
$righe = file ( 'testo.txt' );
foreach ( $righe as $riga ) {
if ( $res = substr ( stristr ( $riga , 'OPEN' ) , 4 ) )
echo '<br />' , ltrim ( $res );
}
Ciao!
PhoEniX-VooDoo
09-09-2008, 19:23
grazie, capito, così dovrebbe funzionare ;)
pero sulla guida ufficiale non dice che ritorna anche la stringa di confronto, ma solo quello che segue...
<?php
$email = 'user@example.com';
$domain = strstr($email, '@');
echo $domain; // prints @example.com
?>
> http://ch2.php.net/manual/it/function.strstr.php
per quello non capivo...
matteo micanti
09-09-2008, 19:31
Restituisce il contenuto di haystack dalla prima occorrenza di needle fino alla fine.
Se uno legge attentamente è chiaro, e dall'esempio si capisce... ma effettivamente sì, può essere un'pò ambiguo :rolleyes:
Avrebbero dovuto specificare meglio.
Spero di essere stato utile comunque :)
Ciao!
l'ideale è utilizzare un espressione regolare
http://it2.php.net/regex
matteo micanti
09-09-2008, 20:25
Sì, è più semplice...ma in termini di prestazioni non so se converebbe molto di più, in particolare con ereg..
In questo caso, dove l'uso delle espressioni regolari non è strettamente necessario, direi di evitarlo :)
Ciao!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.