Какое регулярное выражение используется для преобразования этой строки в массив?

Из геопространственного столбца в mysql я получаю следующее строковое значение, которое я хочу преобразовать в массив. Конечная цель – преобразовать его в geoJSON.

POLYGON((4.885838 52.388063,4.891061 52.388381,4.890973 52.382909)) 

Эта строка имеет 3 пары координат с координатами x и y, разделенными пробелом, и пары, разделенные запятой. Точное число неизвестно и переменно. Также POLYGON может отличаться тремя различными настройками.

С моим небольшим знанием рег. выражениями я придумал это:

 $pat = '/^(POLYGON|LINESTRING|POINT)(\(\() (.....) (\)\))$/'; preg_match($pat, $str, $matches); 

С частью координат с двойными скобками в качестве неопределенной части.

Может ли кто-нибудь помочь мне с этим?

В конечном итоге результирующий массив должен выглядеть так:

 $array['type'] = POLYGON | LINESTRING .... $array['coordinates'] = array of all the coordinates. 

Я думаю, что проще и удобнее обслуживать только explode и array_map в строке координат:

 $coordString = $matches[3]; $coordinates = array_map(function($e) { return explode(' ', $e); }, explode(',', $coordString)); 

Лучше всего решать это поэтапно. Только первый этап должен использовать регулярное выражение:

  1. Найдите всю строку координат как один глобус, например:

    "4.885838 52.388063,4.891061 52.388381,4.890973 52.382909"

  2. Разделите эту строку на координатные пары, разделенные запятой. В Python мы будем использовать str.split(',') . Я считаю, что ваш эквивалент PHP называется explode() .

    [ "4.885838 52.388063" , "4.891061 52.388381" , "4.890973 52.382909" ]

  3. Разделите каждую координатную пару на два числа, разделенные пробелом: str.split(' ') .

    [ ["4.885838","52.388063"] , ["4.891061","52.388381"] , ["4.890973","52.382909"] ]

  4. Преобразовать в поплавки. В python мы используем float() : ваш локальный эквивалент можно назвать str2float() или аналогичным.

    [ [4.885838,52.388063] , [4.891061,52.388381] , [4.890973,52.382909] ]

Чтобы найти строку чисел для шага 1, попробуйте регулярное выражение

 ([-]?\d+.\d+ [-]?\d+.\d+)((,[-]?\d+.\d+ [-]?\d+.\d+)+)? 

который находит по крайней мере одну пару координат в формате xy с координатными парами, разделенными запятыми. Вы можете видеть регулярное выражение в действии на regexr .