Справка Regex с управлением строкой

я серьезно изо всех сил пытаюсь получить голову вокруг regex.

У меня есть sring с "iPhone: 52.973053,-0.021447"

я хочу извлечь эти два числа после двоеточия в две отдельных строки, так разграниченные запятой.

Кто-либо может помочь мне?Удачи

5
задан user310070 6 April 2010 в 13:46
поделиться

6 ответов

Решение без использования регулярных выражений с использованием 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);
2
ответ дан 14 December 2019 в 01:05
поделиться

Попробуйте:

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
7
ответ дан 14 December 2019 в 01:05
поделиться

Попробуйте:

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

preg_match_all( "/-?\d+\.\d+/", $string, $result );
print_r( $result );
0
ответ дан 14 December 2019 в 01:05
поделиться

Еще более простым решением является использование 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
)
0
ответ дан 14 December 2019 в 01:05
поделиться

Мне нравится решение @Felix без регулярных выражений, я думаю, что его решение проблемы более понятно и читаемо, чем использование регулярного выражения.

Не забывайте, что вы можете использовать константы / переменные, чтобы изменить разделение запятой или двоеточием, если исходный формат строки изменен.

Что-то вроде

define('COORDINATE_SEPARATOR',',');
define('DEVICE_AND_COORDINATES_SEPARATOR',':');
0
ответ дан 14 December 2019 в 01:05
поделиться
$str="iPhone: 52.973053,-0.021447";
$s = array_filter(preg_split("/[a-zA-Z:,]/",$str) );
print_r($s);
0
ответ дан 14 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: