2011-07-30 15 views
6

Me encanta la función SUBSTRING_INDEX en MySQL, especialmente porque puede usar índices negativos para comenzar a buscar desde el lado derecho de la cadena.PHP: ¿equivalente a la función SUBSTRING_INDEX de MySQL?

¿Hay un equivalente de esta función en PHP? (O una forma fácil de hacerlo con un poco de código)

+3

Para aquellos que estén pensando 'substr', leer la definición de [' SUBSTRING_INDEX'] (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index) –

Respuesta

14

No hay función de biblioteca única que obtiene esta misma funcionalidad, pero se puede obtener una sola línea:

$str = "www.mysql.com"; 
echo implode('.', array_slice(explode('.', $str), 0, 2)); // prints "www.mysql" 
echo implode('.', array_slice(explode('.', $str), -2)); // prints "mysql.com" 

fácilmente convertir esto en una función:

function substring_index($subject, $delim, $count){ 
    if($count < 0){ 
     return implode($delim, array_slice(explode($delim, $subject), $count)); 
    }else{ 
     return implode($delim, array_slice(explode($delim, $subject), 0, $count)); 
    } 
} 
-2
function substring_index($subject, $delim, $count){ 
    if($count < 0){ 
     return implode($delim, array_slice(explode($delim, $subject), $count)); 
    }else{ 
     return implode($delim, array_slice(explode($delim, $subject), 0, $count)); 
    } 
} 
3

creo

string strstr (string $haystack , mixed $needle [, bool $before_needle = false ]) 

es la función php correcta para usted.

strstr - Encuentra la primera aparición de una cadena

<?php 
$email = '[email protected]'; 
$domain = strstr($email, '@'); 
echo $domain; // prints @example.com 

$user = strstr($email, '@', true); // As of PHP 5.3.0 
echo $user; // prints name 
?> 
0

tenía curiosidad y probé otro método utilizando una configuración preg/partido, entonces rediseñado para permitir cualquier número de delimitadores/recuento. Añadí en la verificación de conteo que el otro ejemplo estaba usando, pero probablemente también recomendaría algún tipo de desinfección del campo del delimitador.

function substring_index($subject, $delim, $count){ 
    if($count < 0){ 
    $notRe = '[^\\'.$delim.']*'; 
    $elem = array(); 
    for($x=1;$x<=$count;$x++){ 
     array_push($elem,$notRe); 
    } 
    $re = '/^('.implode('\\'.$delim,$elem).')/'; 
    preg_match($re, $subject,$m); 
    if(count($m) == 2) { 
     return $m[1]; 
    } 
    } 
} 
Cuestiones relacionadas