Necesito una función que devuelva la subcadena entre dos palabras (o dos caracteres). Me pregunto si hay una función php que lo logre. No quiero pensar en expresiones regulares (bueno, podría hacer una, pero realmente no creo que sea la mejor manera de hacerlo). Pensamiento strpos
y substr
funciones. Aquí hay un ejemplo:
$string = "foo I wanna a cake foo";
Llamamos a la función: $substring = getInnerSubstring($string,"foo");
Devuelve: "Quiero un pastel".
Gracias por adelantado.
Actualización:
Bueno, hasta ahora, solo puedo obtener una subcadena entre dos palabras en una sola cadena, ¿me permites ir un poco más lejos y preguntar si puedo extender el uso de getInnerSubstring($str,$delim)
para obtener cualquier cadena que esté entre el valor delim, ejemplo:
$string =" foo I like php foo, but foo I also like asp foo, foo I feel hero foo";
Me sale una serie como {"I like php", "I also like asp", "I feel hero"}
.
\Illuminate\Support\Str::between('This is my name', 'This', 'name');
es conveniente. laravel.com/docs/7.x/helpers#method-str-betweenRespuestas:
Si las cadenas son diferentes (es decir: [foo] y [/ foo]), eche un vistazo a esta publicación de Justin Cook. Copio su código a continuación:
fuente
Las expresiones regulares son el camino a seguir:
onlinePhp
fuente
Uso de la muestra:
fuente
Ejemplo de uso:
Si desea eliminar los espacios en blanco circundantes, use
trim
. Ejemplo:fuente
fuente
use la función strstr php dos veces.
salidas:
"is a great day to"
fuente
Me gustan las soluciones de expresión regular, pero ninguna de las otras me conviene.
Si sabe que solo habrá 1 resultado, puede usar lo siguiente:
Cambie ANTES y DESPUÉS a los delimitadores deseados.
También tenga en cuenta que esta función devolverá toda la cadena en caso de que nada coincida.
Esta solución es multilínea, pero puedes jugar con los modificadores según tus necesidades.
fuente
No es un profesional de php. pero recientemente me encontré con este muro también y esto es lo que se me ocurrió.
fuente
Si lo está utilizando
foo
como delimitador, mireexplode()
fuente
Ejemplo:
Esto devolverá "el chico en el medio".
fuente
Si tiene múltiples recurrencias de una sola cadena y tiene un patrón [inicio] y [\ final] diferente. Aquí hay una función que genera una matriz.
fuente
Aquí hay una función
Úselo como
Salida (tenga en cuenta que devuelve espacios en frente y en y de su cadena si existe)
Si desea recortar el resultado, utilice la función como
Resultado : esta función devolverá falso si
$boundstring
no se encontró en$string
o si$boundstring
existe solo una vez$string
, de lo contrario, devuelve la subcadena entre la primera y la última aparición de$boundstring
in$string
.Referencias
fuente
IF
cláusula estás hablando? tal vez hice un error tipográfico, pero para ser honesto, no puedo ver nada extraño en este momento. AmbosIF
s que he usado en la función anterior tienen corchetes adecuados en torno a la condición. PrimeroIF
también tienen llaves (llaves) que rodean el bloque de 2 líneas, el segundoIF
no las necesita porque es un código de línea única. ¿Qué me estoy perdiendo?Mejora de la respuesta de Alejandro . Puede dejar los argumentos
$start
o$end
vacíos y usará el inicio o el final de la cadena.fuente
Utilizar:
fuente
Un código un poco mejorado de GarciaWebDev y Henry Wang. Si se da $ start o $ end vacío, la función devuelve valores desde el principio o hasta el final de la cadena $. También está disponible la opción Inclusivo, tanto si queremos incluir el resultado de la búsqueda como si no:
fuente
Tengo que agregar algo a la publicación de Julius Tilvikas. Busqué una solución como esta que él describió en su publicación. Pero creo que hay un error. No consigo realmente la cadena entre dos cadenas, también obtengo más con esta solución, porque tengo que restar la longitud de la cadena de inicio. Cuando hago esto, realmente obtengo la Cadena entre dos cadenas.
Aquí están mis cambios de su solución:
Saludar
V
fuente
Prueba esto, es trabajo para mí, obtener datos entre la palabra de prueba .
fuente
En el
strpos
estilo de PHP, esto regresaráfalse
si no se encuentra la marca de iniciosm
o la marca de finalizaciónem
.Este resultado (
false
) es diferente de una cadena vacía que es lo que obtienes si no hay nada entre las marcas de inicio y fin.La función devolverá solo la primera coincidencia.
Es obvio, pero vale la pena mencionar que la función primero buscará
sm
y luego buscaráem
.Esto implica que es posible que no obtenga el resultado / comportamiento deseado si
em
primero debe buscarse y luego la cadena debe analizarse hacia atrás en busca desm
.fuente
Esta es la función que estoy usando para esto. Combiné dos respuestas en una función para delimitadores simples o múltiples.
Para uso simple (devuelve dos):
Para obtener cada fila de una tabla en la matriz de resultados:
fuente
yo suelo
Subtitúle <TAG> para cualquier delimitador que desee.
fuente
una versión editada de lo que puso Alejandro García Iglesias.
Esto le permite elegir una ubicación específica de la cadena que desea obtener en función de la cantidad de veces que se encuentra el resultado.
uso:
strpos tiene una entrada opcional adicional para comenzar su búsqueda en un punto específico. así que almaceno la posición anterior en $ cPos para que cuando el ciclo for vuelva a comprobar, comience al final de donde lo dejó.
fuente
La gran mayoría de las respuestas aquí no responden a la parte editada, supongo que se agregaron antes. Se puede hacer con expresiones regulares, como una respuesta menciona. Tenía un enfoque diferente.
Esta función busca $ string y encuentra la primera cadena entre $ start y $ end strings, comenzando en la posición $ offset. Luego actualiza la posición $ offset para señalar el inicio del resultado. Si $ includeDelimiters es verdadero, incluye los delimitadores en el resultado.
Si no se encuentra la cadena $ start o $ end, devuelve nulo. También devuelve un valor nulo si $ string, $ start o $ end son una cadena vacía.
La siguiente función encuentra todas las cadenas que se encuentran entre dos cadenas (sin superposiciones). Requiere la función anterior, y los argumentos son los mismos. Después de la ejecución, $ offset apunta al inicio de la última cadena de resultados encontrados.
Ejemplos:
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
da[' 1 ', ' 3 ']
.str_between_all('foo 1 bar 2', 'foo', 'bar')
da[' 1 ']
.str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
da[' 1 ', ' 3 ']
.str_between_all('foo 1 bar', 'foo', 'foo')
da[]
.fuente
Utilizar:
fuente
Tuve algunos problemas con la función get_string_between (), utilizada aquí. Entonces vine con mi propia versión. Tal vez podría ayudar a las personas en el mismo caso que el mío.
fuente
escribí esto hace algún tiempo, lo encontré muy útil para una amplia gama de aplicaciones.
fuente
Con algún error en la captura. Específicamente, la mayoría de las funciones presentadas requieren que $ end exista, cuando en realidad en mi caso necesitaba que fuera opcional. Use this $ end es opcional y evalúe FALSE si $ start no existe en absoluto:
fuente
La versión UTF-8 de la respuesta de @Alejandro Iglesias funcionará para caracteres no latinos:
fuente
Tengo la mejor solución para esto de tonyspiro
fuente
Se puede hacer fácilmente usando esta pequeña función:
fuente
He estado usando esto durante años y funciona bien. Probablemente podría hacerse más eficiente, pero
grabstring ("Test string", "", "", 0) devuelve Test string
grabstring ("Test string", "Test", "", 0) devuelve string
grabstring ("Test string", "s", "", 5) devuelve cadena
}
fuente