2010-10-27 21 views
12

digamos que quiero devolver todos los caracteres después de algún carbón aguja 'x' de:PHP substr después de cierto char, una solución elegante de substr + strpos?

$source_str = "Tuex helo babe".

Normalmente Me gustaría hacer esto:

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

¿Sabe usted una mejor inteligente (forma más elegante)/para hacer esto?

Sin utilizar regexp que no lo haga más elegante y probablemente también más lento.

Desafortunadamente, no podemos hacer:

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

Porque cuando 'x' no se encuentra strpos vuelve FALSE (y no -1 como en JS). FALSE evaluaría a cero, y el primer carácter siempre se cortaría.

Gracias,

+2

Utilice su primer enfoque. – Gumbo

+0

¿No podría eliminar el "! == FALSE" y así será un poco más compacto? – Adam

+0

@Gumbo, me temo que tienes razón. Por favor, escríbalo como una respuesta, y yo elijo el tuyo, a menos que salga algo mejor. –

Respuesta

10

Su primer enfoque está bien: comprobar si x está contenido con strpos y si es así conseguir nada después con substr.

Pero también se podría utilizar strstr:

strstr($str, 'x') 

Pero como esto devuelve la subcadena comenzando conx, utiliza substr para obtener la pieza después de x:

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

pero esto está lejos más complicado. Entonces, use su enfoque strpos.

+0

Pero strstr devuelve FALSE si no se encuentra la aguja, no toda la cadena. –

+0

de PHP 5.3+ strstr() acepta un tercer parámetro opcional 'before_needle' que le permite incluir o excluir la aguja. Entonces ya no es necesario usar substr. –

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

menos elegante, pero sin x en el principio:

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

esto incluirá la 'x' dentro de $ source_str though – Adam

+0

Bien, gracias por su respuesta, pero es discutible que esto sea más elegante, y definitivamente más lento. "Si solo quiere determinar si una aguja en particular se encuentra en el pajar, use la más rápida y menos función de memoria strpos() en su lugar ". [fuente: http://it.php.net/strstr] –

+0

Estoy confundido. 'strpos' es verificar la existencia de subcadenas y se usa en mi respuesta. 'strstr' es devolver una parte de la cadena, solo si se produce una subcadena. Lo encuentro más elegante porque no necesita una variable auxiliar, no hay una asignación engañosa en la línea 'if()' y es más corta. El único defecto es que @adam mencionó –

3

expresiones regulares podría hacer que sea mucho más elegante:

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

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

pero siempre se puede intentar esto:

// 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 '-' al final de $item por lo que siempre devuelve una cadena antes de que '-' incluso $item no contenga '-', porque strpos devuelve por defecto la posición de la primera aparición de '-'.

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

que necesitaba sólo eso, y tratando de mantenerlo en una línea para la diversión se le ocurrió esto:

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

El ternary operator fue adaptado en 5.3 para permitir que esto funcione.

Desde PHP 5.3, es posible omitir la parte central del operador ternario. Expresión expr1?: Expr3 devuelve expr1 si expr1 se evalúa como VERDADERO, y expr3 en caso contrario.

NB. ltrim recortará múltiples caracteres coincidentes al comienzo de la cadena.

Cuestiones relacionadas