2010-10-27 27 views
12

diciamo che voglio tornare tutti i caratteri dopo un po 'l'ago char 'x' da:Sub di PHP dopo un determinato carattere, una soluzione substr + strpos elegante?

$source_str = "Tuex helo babe".

Normalmente farei questo:

if(($x_pos = strpos($source_str, 'x')) !== FALSE) 
    $source_str = substr($source_str, $x_pos + 1); 

Sai una/più intelligente (modo più elegante) migliore per fare questo?

Senza utilizzare regexp che non lo renderebbe più elegante e probabilmente anche più lento.

Purtroppo non possiamo fare:

$source_str = substr(source_str, strpos(source_str, 'x') + 1); 

Perché quando 'x' non viene trovato strpos rendimenti FALSE (e non -1 come in JS). FALSE valuterebbe a zero e il primo carattere sarebbe sempre interrotto.

Grazie,

+2

Usa il tuo primo approccio. – Gumbo

+0

non è possibile rimuovere "! == FALSE" e in questo modo sarà un po 'più compatto? – Adam

+0

@ Gumbo, temo che tu abbia ragione. Plz lo annota come risposta, e io scelgo il tuo, a meno che qualcosa di meglio non venga fuori. –

risposta

10

Il tuo primo approccio va bene: controllare se x è contenuto con strpos e se così ottenere qualcosa dopo che con substr.

Ma si potrebbe anche usare strstr:

strstr($str, 'x') 

Ma questo restituisce la stringa che inizia conx, utilizzare substr per ottenere la parte dopo x:

if (($tmp = strstr($str, 'x')) !== false) { 
    $str = substr($tmp, 1); 
} 

Ma questo è lontano più complicato. Quindi usa invece l'approccio strpos.

+0

Ma strstr restituisce FALSE se l'ago non viene trovato, non l'intera stringa. –

+0

da PHP 5.3+ strstr() accetta un terzo parametro opzionale 'before_needle' che consente di includere o escludere l'ago. Quindi non c'è più bisogno di usare substr. –

0
if(strpos($source_str, 'x') !== FALSE) 
    $source_str = strstr($source_str, 'x'); 

meno elegante, ma senza x in principio:

if(strpos($source_str, 'x') !== FALSE) 
    $source_str = substr(strstr($source_str, 'x'),1); 
+0

questo includerà la 'x' all'interno di $ source_str anche se – Adam

+0

Bene, grazie per la tua risposta, ma è discutibile che questo è più elegante e decisamente più lento "Se vuoi solo determinare se un particolare ago si verifica all'interno del pagliaio, usa il più veloce e meno invece la funzione di memoria intensiva(). " [fonte: http://it.php.net/strstr] –

+0

Sono confuso. 'strpos' è per verificare la presenza di sottostringhe e viene utilizzato nella mia risposta. 'strstr' è di restituire una porzione di stringa, solo se si verifica una sottostringa. Lo trovo più elegante perché non ha bisogno di variabili ausiliarie, non c'è assegnamento fuorviante nella riga 'if()' ed è più breve. L'unico difetto è quello che @adam ha menzionato –

3

regex renderebbe molto più elegante:

// helo babe 
echo preg_replace('~.*?x~', '', $str); 

// Tuex helo babe 
echo preg_replace('~.*?y~', '', $str); 

ma si può sempre provare questo:

// helo babe 
echo str_replace(substr($str, 0, strpos($str, 'x')) . 'x', '', $str); 

// Tuex helo babe 
echo str_replace(substr($str, 0, strpos($str, 'y')) . 'y', '', $str); 
-1

Ap pend a '-' alla fine di $item quindi restituisce sempre la stringa prima di '-' anche $item non contiene '-', perché strpos di default restituisce la posizione della prima occorrenza di di "-".

substr($item,0,strpos($item.'-','-')) 
0

mi serviva solo questo, e cercando di tenerlo su una linea per divertimento arrivato fino a questo:

ltrim(strstr($source_str, $needle = "x") ?: $source_str, $needle);

Il ternary operator è stato adattato in 5.3 per permettere questo al lavoro.

Dal PHP 5.3, è possibile escludere la parte centrale dell'operatore ternario. Espressione expr1?: Expr3 restituisce expr1 se expr1 restituisce TRUE ed expr3 in caso contrario.

NB. ltrim eliminerà più caratteri corrispondenti all'inizio della stringa.