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 cadena hasta el primero /
, pero si no/
hay presente, obtener toda la cadena.
Lo intenté,
substr($mystring, 0, strpos($mystring, '/'))
Creo que dice: obtenga la posición de /
y luego obtenga la subcadena de la posición 0 a esa posición.
No sé cómo manejar el caso donde no hay /
, sin hacer que la declaración sea demasiado grande.
¿Hay alguna manera de manejar ese caso también sin hacer que la declaración de PHP sea demasiado compleja?
s($str)->beforeFirst('/')
útil, como se encuentra en esta biblioteca independiente .Respuestas:
Utilizar
explode()
En este caso, estoy usando el
limit
parámetro paraexplode
que php no escanee la cadena más de lo necesario.fuente
$arr = explode('/',$mystring,2); echo $arr[0];
. No puedo obtener la primera cadena en una sola declaración -echo explode('/',$mystring,2)[0];
. Como explotar devuelve una matriz, ¿debería poder hacerlo bien? Pero me sale un error. ¿Alguna sugerencia?explode() + [0]
es una manera larga de escribirstrtok($string, "/")
La solución más eficiente es la
strtok
función:Por ejemplo:
y
fuente
current-explode
solución. (No es que lo use tan a menudo que sea importante)explode
soluciones dadas.strtok
esfirst/second
volveráfirst
pero/second
volverá ensecond
lugar de una cadena vacía.fuente
¿Qué hay de esto?
Simplemente agregue un '/' al final de mystring para que pueda estar seguro de que hay al menos uno;)
fuente
Versión de una línea de la respuesta aceptada:
Debería funcionar en php 5.4+
fuente
Este es probablemente el ejemplo más corto que se me ocurrió:
1)
list()
asignará automáticamente la cadena hasta"/"
que se encuentre el delimitador2) si
"/"
no se encuentra el delimitador, entonces se asignará toda la cadena... y si realmente te obsesionas con el rendimiento, puedes agregar parámetros adicionales para explotar, lo
explode("/", $mystring, 2)
que limita el máximo de los elementos devueltos.fuente
strtok()
no es seguro.strtok()
?strtok()
inseguro?Más vale tarde que nunca. php tiene una función predefinida para eso. Aquí está ese buen camino.
si desea obtener la parte antes del partido, simplemente configure before_needle (tercer parámetro) en
true
http://php.net/manual/en/function.strstr.phpfuente
strstr
es un poco más rápido questrtok
. Iré con el primero.La función strstr () en PHP 5.3 debería hacer este trabajo. Sin embargo, el tercer parámetro debe establecerse en verdadero.
Pero si no está utilizando 5.3, entonces la siguiente función debería funcionar con precisión:
Sin embargo, no lo he probado, pero esto debería funcionar bien ... Y también es bastante rápido
fuente
strstr()
, pero tenga en cuenta que devuelvefalse
si la cadena no contiene$needle
, por lo tanto, lasexplode()
soluciones anteriores se ajustan mejor en este caso.Puede crear una función auxiliar para encargarse de eso:
Aquí hay un caso de uso:
fuente
Puedes intentar usar una expresión regular como esta:
a veces, las expresiones regulares son más lentas, así que si el rendimiento es un problema, asegúrese de compararlo correctamente y use otra alternativa con subcadenas si es más adecuado para usted.
fuente
explode
, sería interesante ver cuál es más rápido.Usando
current
elexplode
facilitaría el proceso.fuente
fuente
También puede usar esta solución de una línea
fuente
¿Creo que esto debería funcionar?
fuente
por qué no usar:
O:
fuente