я серьезно изо всех сил пытаюсь получить голову вокруг regex.
У меня есть sring с "iPhone: 52.973053,-0.021447"
я хочу извлечь эти два числа после двоеточия в две отдельных строки, так разграниченные запятой.
Кто-либо может помочь мне?Удачи
Решение без использования регулярных выражений с использованием explode ()
и 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));
Предполагается, что строка всегда содержит двоеточие.
Или, если идентификатор перед двоеточием содержит только символы (не числа), вы также можете сделать это:
$string = "iPhone: 52.973053,-0.021447";
$string = trim($string, "a..zA..Z: ");
//$string = "52.973053,-0.021447"
$coordinates = explode(',', $string);
Попробуйте:
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);
, что даст:
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
)
)
Или просто:
preg_match('/\w+:\s*(-?\d+\.\d+),(-?\d+\.\d+)/',
"iPhone: 52.973053,-0.021447",
$match);
print_r($match);
, если строка содержит только одну координату.
Небольшое пояснение:
\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
Попробуйте:
$string = "iPhone: 52.973053,-0.021447";
preg_match_all( "/-?\d+\.\d+/", $string, $result );
print_r( $result );
Еще более простым решением является использование preg_split() с более простым regex, например
$str = 'iPhone: 52.973053,-0.021447';
$parts = preg_split('/[ ,]/', $str);
print_r($parts);
что даст вам
Array
(
[0] => iPhone:
[1] => 52.973053
[2] => -0.021447
)
Мне нравится решение @Felix без регулярных выражений, я думаю, что его решение проблемы более понятно и читаемо, чем использование регулярного выражения.
Не забывайте, что вы можете использовать константы / переменные, чтобы изменить разделение запятой или двоеточием, если исходный формат строки изменен.
Что-то вроде
define('COORDINATE_SEPARATOR',',');
define('DEVICE_AND_COORDINATES_SEPARATOR',':');
$str="iPhone: 52.973053,-0.021447";
$s = array_filter(preg_split("/[a-zA-Z:,]/",$str) );
print_r($s);