2010-10-27 4 views
12

disons que je veux retourner tous les caractères après un char aiguille 'x' de:PHP substr après un certain char, un substr + strpos solution élégante?

$source_str = "Tuex helo babe".

Normalement, je ferais ceci:

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

connaissez-vous une meilleure/plus intelligente (façon plus élégante) pour le faire?

Sans utiliser regexp qui ne le rendrait pas plus élégant et probablement plus lent.

Malheureusement nous ne pouvons pas faire:

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

Parce que quand 'x' ne se trouve pas strpos retours FALSE (et non -1 comme dans JS). FALSE évaluerait à zéro, et 1er char serait toujours coupé.

Merci,

+2

Utilisez votre première approche. – Gumbo

+0

ne pourriez-vous supprimer le "! == FALSE" et de cette façon, il sera un peu plus compact? – Adam

+0

@Gumbo, je crains que vous avez raison. Plz l'écris comme une réponse, et je choisis la vôtre, à moins que quelque chose de mieux ne sorte. –

Répondre

10

Votre première approche est très bien: Vérifiez si x est contenu avec strpos et si oui obtenir quelque chose après avec substr.

Mais vous pouvez aussi utiliser strstr:

strstr($str, 'x') 

Mais comme cela retourne la sous-chaîne commençant avecx, utilisez substr pour obtenir la partie après x:

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

Mais cela est loin plus compliqué. Alors utilisez plutôt votre approche strpos.

+0

Mais strstr retourne FALSE si l'aiguille n'est pas trouvée, pas toute la chaîne. –

+0

de PHP 5.3+ strstr() accepte un troisième paramètre facultatif 'before_needle' qui vous permet d'inclure ou d'exclure l'aiguille. Donc plus besoin d'utiliser substr. –

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

moins élégante, mais sans x au début:

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

cela inclura le 'x' dans $ source_str si – Adam

+0

Eh bien merci pour votre réponse, mais on peut soutenir que c'est plus élégant, et certainement plus lent "Si vous voulez seulement déterminer si une aiguille particulière se trouve dans la botte de foin, utilisez le moins de fonction intensive de mémoire strpos() à la place. " [source: http://it.php.net/strstr] –

+0

Je suis confus. 'strpos' est de vérifier l'occurrence de la sous-chaîne et il est utilisé dans ma réponse. 'strstr' est de retourner la partie de la chaîne, seulement si la sous-chaîne se produit. Je le trouve plus élégant parce qu'il n'a pas besoin de variable auxiliaire, il n'y a pas d'affectation trompeuse dans la ligne 'if()' et c'est plus court. Le seul défaut est que @adam a mentionné –

3

Regexes rendrait beaucoup plus élégante:

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

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

Mais vous pouvez toujours essayer ceci:

// 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 un '-' à la fin de $item donc il retourne toujours la chaîne avant '-' même $item ne contient pas '-', parce que strpos renvoie par défaut la position de la première occurrence de '-'.

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

je avais besoin tout cela, et cherchant à le maintenir sur une ligne pour le plaisir est venu avec ceci:

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

Le ternary operator a été adapté à 5.3 pour permettre que cela fonctionne.

Depuis PHP 5.3, il est possible d'omettre la partie centrale de l'opérateur ternaire. Expression expr1?: Expr3 renvoie expr1 si expr1 est évalué à TRUE, et expr3 sinon.

NB. ltrim va couper plusieurs caractères correspondants au début de la chaîne.

Questions connexes