2010-10-27 7 views
12

lassen Sie uns sagen, ich möchte alle Zeichen nach einigen Nadel char 'x' aus:PHP substr nach einem bestimmten char, eine substr + strpos elegante Lösung?

$source_str = "Tuex helo babe" zurückgeben.

Normalerweise würde ich das tun:

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

Kennst du eine bessere/intelligentere (elegantere Weise), dies zu tun?

Ohne regexp wäre das nicht eleganter und wahrscheinlich auch langsamer.

Leider können wir nicht tun:

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

Denn wenn 'x' nicht gefunden wird, gibt strposFALSE zurück (und nicht -1 wie in JS). FALSE würde zu null auswerten, und das erste Zeichen wäre immer abgeschnitten.

Danke,

+2

Verwenden Sie Ihren ersten Ansatz. – Gumbo

+0

konnten Sie das "! == FALSE" nicht entfernen und so wird es etwas kompakter? – Adam

+0

@Gumbo, ich fürchte, du hast Recht. Plz schreiben Sie es als eine Antwort auf, und ich wähle Ihre, es sei denn etwas Besseres kommt heraus. –

Antwort

10

Ihr erster Ansatz ist in Ordnung: Prüfen Sie, ob x mit strpos enthalten ist, und wenn ja etwas, nachdem sie mit substr bekommen.

Aber Sie könnten auch strstr verwenden:

strstr($str, 'x') 

Aber da dies den Teil kehrt Anfang mitx verwenden substr den Teil nach x zu bekommen:

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

Aber so weit ist komplizierter. Verwenden Sie stattdessen Ihren strpos Ansatz.

+0

Aber Strstr zurück FALSE wenn Nadel nicht gefunden wird, nicht die gesamte Zeichenfolge. –

+0

von PHP 5.3+ strstr() akzeptiert einen optionalen dritten Parameter 'before_needle', mit dem Sie die Nadel ein- oder ausschließen können. Also keine Notwendigkeit, substr mehr zu verwenden. –

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

Weniger elegant, aber ohne x am Anfang:

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

das wird das 'x' innerhalb $ source_str obwohl – Adam

+0

Nun danke für Ihre Antwort, aber es ist streitbar, dass dies eleganter ist, und definitiv langsamer "Wenn Sie nur bestimmen möchten, ob eine bestimmte Nadel im Heuhaufen auftritt, verwenden Sie die schneller und weniger speicherintensive Funktion strpos() statt. " [Quelle: http://it.php.net/strstr] –

+0

Ich bin verwirrt. 'strpos' soll auf Teilstringvorkommen prüfen und wird in meiner Antwort verwendet. 'strstr' soll einen Teil der Zeichenkette zurückgeben, nur wenn Teilstrings vorkommen. Ich finde es eleganter, weil es keine Hilfsvariable benötigt, es gibt keine irreführende Zuweisung in der Zeile 'if()' und es ist kürzer. Der einzige Fehler davon ist, was @adam –

3

Regexes wäre es eleganter viel machen:

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

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

Aber man kann immer versuchen, diese:

// 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 '-' am Ende von $item so gibt es immer String vor '-' sogar $item enthält nicht '-', da strpos standardmäßig die Position des ersten Auftretens von '-' zurückgibt.

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

ich gerade dies erforderlich ist, und das Streben es zum Spaß auf einer Linie zu halten, kam mit dieser:

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

Die ternary operator in 5.3 angepasst wurde, dies zu ermöglichen, zu arbeiten.

Seit PHP 5.3 ist es möglich, den mittleren Teil des ternären Operators wegzulassen. Expression expr1?: Expr3 gibt expr1 zurück, wenn expr1 TRUE ergibt, andernfalls expr3.

NB. ltrim trimmt mehrere übereinstimmende Zeichen am Anfang der Zeichenfolge.