Por favor considere esta cadena:

$string = 'hello world /foo bar/';

El resultado final que deseo obtener:

$result1 = 'hello world';
$result2 = 'foo bar';

Lo que he intentado:

preg_match('/\/(.*?)\//', $string, $match);

El problema es que esto solo devuelve "foo bar" y no "hola mundo". Probablemente pueda quitar "/ foo bar /" de la cadena original, pero en mi caso de uso real, eso requeriría 2 pasos adicionales.

-3
Mike Feng 25 ene. 2016 a las 20:02

3 respuestas

La mejor respuesta

La expresión regular solo coincide con lo que le dice que coincida. Por lo tanto, debe hacer que coincida con todo, incluidos los / y luego agrupar los /.

Esto debería hacerlo:

$string = 'hello world /foo bar/';
preg_match('~(.+?)\h*/(.*?)/~', $string, $match);
print_r($match);

Demostración de PHP: https://eval.in/507636
Regex101: https://regex101.com/r/oL5sX9/1 (delimitadores de escape, en PHP el uso cambió el delimitador)

El índice 0 es todo lo que se encuentra, 1 el primer grupo, 2 el segundo grupo. Así que entre / s está $match[2]; el hello world es $match[1]. El \h es cualquier espacio en blanco horizontal antes del / si desea que en el primer grupo elimine el \h*. El . tendrá en cuenta los espacios en blanco (excluyendo la nueva línea a menos que se especifique con el modificador s).

2
chris85 25 ene. 2016 a las 17:22

Para resolver este problema de conversión, use el siguiente código.

$string      = 'hello world /foo bar/';
$returnValue =  str_replace(' /', '/', $string);
$result      =  explode("/", $returnValue);

Si desea imprimirlo, coloque las líneas debajo de su código.

echo $pieces[0]; // hello world
echo $pieces[1]; // foo bar

https://eval.in/507650

0
AsgarAli 25 ene. 2016 a las 19:00
$result = explode("/", $string);

Resultados en

$result[0] == 'hello world ';
$result[1] == 'foo bar';

Es posible que desee reemplazar el espacio en hola mundo. Más información aquí: http://php.net/manual/de/function.explode.php

2
chris85 25 ene. 2016 a las 17:14