2010-04-06 8 views
5

Estoy luchando seriamente para ponerme al corriente con la expresión regular.Regex Ayuda con la manipulación de la cadena

Tengo un sring con "iPhone: 52.973053, -0.021447"

i desea extraer los dos números después de los dos puntos en dos cadenas separadas de modo delimitadas por la coma.

¿Alguien me puede ayudar? Saludos

Respuesta

2

una solución sin el uso de expresiones regulares, utilizando explode() y stripos() :):

$string = "iPhone: 52.973053,-0.021447"; 
$coordinates = explode(',', $string); 
// $coordinates[0] = "iPhone: 52.973053" 
// $coordinates[1] = "-0.021447" 

$coordinates[0] = trim(substr($coordinates[0], stripos($coordinates[0], ':') +1)); 

Suponiendo que la cadena siempre contiene un colon.

O si el identificador antes de los dos puntos sólo contiene caracteres (no números) que se pueden hacer también esto:

$string = "iPhone: 52.973053,-0.021447"; 
$string = trim($string, "a..zA..Z: "); 
//$string = "52.973053,-0.021447" 

$coordinates = explode(',', $string); 
7

Probar:

preg_match_all('/\w+:\s*(-?\d+\.\d+),(-?\d+\.\d+)/', 
    "iPhone: 52.973053,-0.021447 FOO: -1.0,-1.0", 
    $matches, PREG_SET_ORDER); 
print_r($matches); 

que produce:

Array 
(
    [0] => Array 
     (
      [0] => iPhone: 52.973053,-0.021447 
      [1] => 52.973053 
      [2] => -0.021447 
     ) 

    [1] => Array 
     (
      [0] => FOO: -1.0,-1.0 
      [1] => -1.0 
      [2] => -1.0 
     ) 

) 

O simplemente:

preg_match('/\w+:\s*(-?\d+\.\d+),(-?\d+\.\d+)/', 
    "iPhone: 52.973053,-0.021447", 
    $match); 
print_r($match); 

si la cadena contiene sólo una coordenada.

Una pequeña explicación:

\w+  # match a word character: [a-zA-Z_0-9] and repeat it one or more times 
:  # match the character ':' 
\s*  # match a whitespace character: [ \t\n\x0B\f\r] and repeat it zero or more times 
(  # start capture group 1 
    -?  # match the character '-' and match it once or none at all 
    \d+ # match a digit: [0-9] and repeat it one or more times 
    \.  # match the character '.' 
    \d+ # match a digit: [0-9] and repeat it one or more times 
)  # end capture group 1 
,  # match the character ',' 
(  # start capture group 2 
    -?  # match the character '-' and match it once or none at all 
    \d+ # match a digit: [0-9] and repeat it one or more times 
    \.  # match the character '.' 
    \d+ # match a digit: [0-9] and repeat it one or more times 
)  # end capture group 2 
+0

estoy preguntando si es realmente necesario para que coincida con los dígitos? ¿Sería mucho más simple dividirse en dos puntos y coma? (pls discúlpeme si esto es tonto ;-) –

+0

Esa es una opción si la cadena siempre se verá así. Pero tal vez la entrada cambia ligeramente o la coincidencia también se utiliza para la validación. –

0

Probar:

$string = "iPhone: 52.973053,-0.021447"; 

preg_match_all("/-?\d+\.\d+/", $string, $result); 
print_r($result); 
+0

Gracias por la gran ayuda, está trabajando como quiero ahora: D – user310070

0

me gusta @ solución no expresiones regulares de Félix, me Creo que su solución para el problema es más clara y legible que usar una expresión regular.

No olvide que puede usar constantes/variables para cambiar la división por comas o dos puntos si se cambia el formato original de la cadena.

Algo como

define('COORDINATE_SEPARATOR',','); 
define('DEVICE_AND_COORDINATES_SEPARATOR',':'); 
0
$str="iPhone: 52.973053,-0.021447"; 
$s = array_filter(preg_split("/[a-zA-Z:,]/",$str)); 
print_r($s); 
0

Una solución aún más sencilla es utilizar preg_split() con una expresión regular mucho más simple, por ejemplo,

$str = 'iPhone: 52.973053,-0.021447'; 
$parts = preg_split('/[ ,]/', $str); 
print_r($parts); 

que le dará

Array 
(
    [0] => iPhone: 
    [1] => 52.973053 
    [2] => -0.021447 
) 
Cuestiones relacionadas