2010-05-04 10 views
29

Entonces, digamos que tengo un $somestring que tiene el valor "main/physician/physician_view".Tomar el texto restante después del último "/" en una cadena php

Quiero obtener solo "doctor_vista". Quiero que también funcione si la cadena pasada fue "main/physician_view" o "site/main/physician/physician_view".

Espero que mi pregunta tenga sentido. ¡Cualquier ayuda sería apreciada!

+0

Usted puede encontrar [ 's ($ somestring) -> afterLast ('/')'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php # L445) útil, como se encuentra en [esta biblioteca independiente] (https://github.com/delight-im/PHP-Str). – caw

Respuesta

26

Hay muchas formas de hacerlo. Probablemente usaría:

array_pop(explode('/', $string)); 
+1

'explotar' esto:' str_repeat ('/', 1337 * 1337); ' –

+2

Esto arroja una advertencia porque' array_pop() 'espera que el parámetro se pase por referencia, lo que no es posible para un valor de retorno de función (el valor de retorno de 'explotar'). Para evitar la advertencia, podría decir '& explotar' pero solo hasta PHP 5.4. De lo contrario, almacena la cadena explotada en una variable y pasa eso por referencia a 'array_pop()'. – Arild

+0

o, use "end" en lugar de "array_pop". Puede haber menos sobrecarga debido a menos procesamiento de matriz (es decir, eliminación del último elemento de la matriz y retención del conjunto de matriz de recordatorio). (curioso, que es más rápido y utiliza menos recursos - array_pop, end o substr). – bbe

45

Puede utilizar strrpos() para encontrar la última ocurrencia de una cadena en otra:

substr($somestring, strrpos($somestring, '/') + 1) 
+0

+1, la forma más rápida y lógica. –

+3

No siempre funciona. 'path_without_slash' devuelve' ath_without_slash', y si la barra está al final, como 'ruta/a/archivo /' devuelve '(bool) false' – BadHorsie

21

Uso basename, que fue creado para este propósito exacto.

+1

+1, Humm ... Agradable, pero también elimina" \ " (al menos en Windows).Hace lo que el OP quiere, pero un poco más de lo que pide el título de la pregunta. –

2

Las otras soluciones no siempre funcionan, o son ineficaces. Aquí hay una función de utilidad general más útil que siempre funciona y puede usarse con otros términos de búsqueda.

/** 
* Get a substring starting from the last occurrence of a character/string 
* 
* @param string $str The subject string 
* @param string $last Search the subject for this string, and start the substring after the last occurrence of it. 
* @return string A substring from the last occurrence of $startAfter, to the end of the subject string. If $startAfter is not present in the subject, the subject is returned whole. 
*/ 
function substrAfter($str, $last) { 
    $startPos = strrpos($str, $last); 
    if ($startPos !== false) { 
     $startPos++; 
     return ($startPos < strlen($str)) ? substr($str, $startPos) : ''; 
    } 
    return $str; 
} 


// Examples 

substrAfter('main/physician/physician_view', '/'); // 'physician_view' 

substrAfter('main/physician/physician_view/', '/'); // '' (empty string) 

substrAfter('main_physician_physician_view', '/'); // 'main_physician_physician_view' 
2

Se retrasa ...

La manera más fácil incorporado en PHP para agarrar la última cadena después de la última / podría ser simplemente utilizando la función pathinfo.

De hecho, se puede comprobar esto por sí mismo,

$urlString = 'path/to/my/xximage.png'; 

$info = pathinfo($urlString); 

que podría hacer:

var_dump($info); 

esto le dará algo como:

'dirname' => string 'path/to/my/' 
'basename' => string 'xximage.png' 
'extension' => string 'png' (length=3) 
'filename' => string 'xximage' 

manera de extraer el imágenes de ese enlace que podría hacer:

$img=$info['basename']; 
$extension=$info['extension']; 
///etc... 

echo $img.".".$extension; //xximage.png 

Algo pequeño, pero puede hacer que se Grow_Gray_Hair_Prematurely

0

Simplemente puede utilizar:

$id = substr($url, strrpos($url, '/')+1); 
9
$last_part = substr(strrchr($somestring, "/"), 1); 

Ejemplos:

php > $a = "main/physician/physician_view"; 
php > $b = "main/physician_view"; 
php > $c = "site/main/physician/physician_view"; 
php > echo substr(strrchr($a, "/"), 1); 
    physician_view 
php > echo substr(strrchr($b, "/"), 1); 
    physician_view 
php > echo substr(strrchr($c, "/"), 1); 
    physician_view 
0

Por otro chiste, se puede utilizar el explotar truco e invertir la matriz:

current(array_reverse(explode('/',$url))); 
Cuestiones relacionadas