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
limitparámetro paraexplodeque 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
strtokfunción:Por ejemplo:
y
fuente
current-explodesolución. (No es que lo use tan a menudo que sea importante)explodesoluciones dadas.strtokesfirst/secondvolveráfirstpero/secondvolverá ensecondlugar 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
truehttp://php.net/manual/en/function.strstr.phpfuente
strstres 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 devuelvefalsesi 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
currentelexplodefacilitarí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