2010-04-06 13 views
5

Sto seriamente cercando di riprendermi la regex.Regex Aiuto con manipolazione della stringa

Ho uno sring con "iPhone: 52,973,053 mila, -,021447"

Voglio estrarre i due numeri dopo i due punti in due stringhe separate così delimitate dalla virgola.

Qualcuno può aiutarmi? Acclamazioni

risposta

2

Una soluzione senza usare le espressioni regolari, utilizzando explode() e 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)); 

Supponendo che la stringa contiene sempre due punti.

O se l'identificatore prima dei due punti contenga solo caratteri (non numeri) si può fare anche questo:

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

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

Prova:

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); 

che 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 semplicemente:

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

se la stringa contiene una sola coordinata.

Una piccola spiegazione:

\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

Mi chiedo se è davvero necessario corrispondere le cifre? Potrebbe essere molto più semplice dividere in due punti e virgola? (mi scusi se questo è stupido ;-) –

+0

Questa è un'opzione se la stringa sarà sempre così. Ma forse l'input cambia leggermente o la corrispondenza viene anche utilizzata per la convalida. –

0

Prova:

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

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

Grazie per il grande aiuto, sta lavorando come voglio ora: D – user310070

0

mi piace @ soluzione non regex di Felix, io pensa che la sua soluzione per il problema sia più chiara e leggibile rispetto all'utilizzo di una regex.

Non dimenticare che è possibile utilizzare costanti/variabili per modificare la suddivisione in virgola o due punti se il formato della stringa originale viene modificato.

Qualcosa di simile

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 soluzione ancora più semplice è usare preg_split() con una regex molto più semplice, ad esempio

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

che vi darà

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