哪个正则表达式用于将此字符串转换为数组?

问题描述 投票:3回答:3

从mysql的地理空间列中,我获取以下要转换为数组的字符串值。最终目标是将其转换为geoJSON。

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

此字符串具有3个坐标对,其中x和y坐标之间用空格隔开,而该对之间用逗号隔开。确切的数字是未知的并且是可变的。另外,POLYGON可以不同为三个不同的设置。

根据我对reg的一点了解。我想出的表达式:

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

带有双括号的坐标部分作为不确定部分。

有人可以帮我吗?

edit最终生成的数组应如下所示:

$array['type'] = POLYGON | LINESTRING ....
$array['coordinates'] = array of all the coordinates.
php regex geojson
3个回答
0
投票

我认为在坐标字符串上仅使用explodearray_map会更容易且更易于维护:

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

2
投票

您最好分阶段解决。仅第一阶段需要使用正则表达式:

  1. 将整个坐标字符串查找为一个glob,例如:

    "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+)+)?

将查找至少一对x y格式的坐标,坐标对之间用逗号分隔。您可以在regexr上看到正则表达式。


0
投票

我偶然发现了相同的问题,但是在我的情况下,我发现诸如POLYGON ((-1.23 2.34, 3.45 4.56), (3.21 4.32, 5.43 6.54))的模式,并且上述正则表达式对我执行步骤1无效。在进行一些头部抓挠之后,我出现了以下模式:[C0 ]。然后,您将遍历以逗号分隔的匹配项,最后以空格分隔。我不是正则表达式专家,所以也许有人有更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.