recorrer - strpos php
Extracción de subcadena PHP Obtener la cadena antes del primer ''/'' o toda la cadena (14)
Estoy tratando de extraer una subcadena. Necesito ayuda para hacerlo en PHP.
Aquí hay algunas cadenas de muestra con las que estoy trabajando y los resultados que necesito:
home/cat1/subcat2 => home
test/cat2 => test
startpage => startpage
Quiero obtener la cuerda hasta el primero /
, pero si no /
está presente, obtener toda la cadena.
Lo intenté,
substr($mystring, 0, strpos($mystring, ''/''))
Creo que dice: obtener la posición de /
y luego obtener la subcadena desde la posición 0 a esa posición.
No sé cómo manejar el caso donde no hay /
, sin hacer la declaración demasiado grande.
¿Hay alguna manera de manejar ese caso también sin hacer que la declaración de PHP sea demasiado compleja?
¿Creo que esto debería funcionar?
substr($mystring, 0, (($pos = (strpos($mystring, ''/'') !== false)) ? $pos : strlen($mystring)));
¿Qué tal esto?
substr($mystring.''/'', 0, strpos($mystring, ''/''))
Simplemente agregue un ''/'' al final de mystring para que pueda estar seguro de que hay al menos uno;)
Este es probablemente el ejemplo más breve que me vino a la mente:
list($first) = explode("/", $mystring);
1) list()
asignará automáticamente una cadena hasta "/"
si se encuentra el delimitador
2) si no se encuentra el delimitador "/"
, se asignará toda la cadena
... y si realmente te obsesionas con el rendimiento, puedes agregar un parámetro extra para explotar explode("/", $mystring, 2)
que limita el máximo de los elementos devueltos.
La función strstr () en PHP 5.3 debería hacer este trabajo. Sin embargo, el tercer parámetro debería establecerse en verdadero ...
Pero si no está utilizando 5.3, entonces la siguiente función debería funcionar con precisión:
function strbstr( $str, $char, $start=0 ){
if ( isset($str[ $start ]) && $str[$start]!=$char ){
return $str[$start].strbstr( $str, $char, $start+1 );
}
}
Aunque no lo he probado, pero esto debería funcionar bien. Y también es bastante rápido.
La solución más eficiente es la función strtok
:
strtok($mystring, ''/'')
Por ejemplo:
$mystring = ''home/cat1/subcat2/'';
$first = strtok($mystring, ''/'');
echo $first; // home
y
$mystring = ''home'';
$first = strtok($mystring, ''/'');
echo $first; // home
Más vale tarde que nunca. php tiene una función predefinida para eso. aquí está esa buena manera.
strstr
si quieres obtener la parte antes del partido, configura before_needle (3er parámetro) como true
http://php.net/manual/en/function.strstr.php
function not_strtok($string, $delimiter)
{
$buffer = strstr($string, $delimiter, true);
if (false === $buffer) {
return $string;
}
return $buffer;
}
var_dump(
not_strtok(''st/art/page'', ''/'')
);
Puede crear una función auxiliar para que se encargue de eso:
/**
* Return string before needle if it exists.
*
* @param string $str
* @param mixed $needle
* @return string
*/
function str_before($str, $needle)
{
$pos = strpos($str, $needle);
return ($pos !== false) ? substr($str, 0, $pos) : $str;
}
Aquí hay un caso de uso:
$sing = ''My name is Luka. I live on the second floor.'';
echo str_before($sing, ''.''); // My name is Luka
Puedes intentar usar una expresión regular como esta:
$s = preg_replace(''|/.*$|'', '''', $s);
a veces, la expresión regular es más lenta, por lo que si el rendimiento es un problema, asegúrese de compararlo adecuadamente y utilizar otra alternativa con subcadenas si es más adecuado para usted.
Usar la current
en explode
aliviará el proceso.
$str = current(explode("/", $str, 2));
Use explode()
$arr = explode("/", $string, 2);
$first = $arr[0];
En este caso, estoy usando el parámetro limit
para explode
para que php no explore la cadena más de lo que se necesita.
Versión de una línea de la respuesta aceptada:
$out=explode("/", $mystring, 2)[0];
Debería funcionar en php 5.4+
por qué no usar:
function getwhatiwant($s)
{
$delimiter=''/'';
$x=strstr($s,$delimiter,true);
return ($x?$x:$s);
}
O:
function getwhatiwant($s)
{
$delimiter=''/'';
$t=explode($delimiter, $s);
return ($t[1]?$t[0]:$s);
}
$first = explode("/", $string)[0];
$string="kalion/home/public_html";
$newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/"));