正则表达式在括号和#34;()"之间取值

时间:2015-09-30 10:04:45

标签: php regex

我写正则表达式的能力很差。

我试图在括号和#34;()"之间获得价值。像下面的东西......

$a = "POLYGON((1 1,2 2,3 3,1 1))";
preg_match_all("/\((.*)\)/U", $a, $pat_array);
print_r($pat_array);

但这会给我一些像......

的元素
Array
(
    [0] => Array
        (
            [0] => ((1 1,2 2,3 3,1 1)
        )

    [1] => Array
        (
            [0] => (1 1,2 2,3 3,1 1
        )
)

但我想要获取" 1 1,2 2,3 3,1 1"作为输出。

我知道我们可以在获得此输出后修剪括号。但如果使用正则表达式完成,这将是很好的。

提前致谢。

<小时/> 解决方案:根据 @anubhava 回答:

使用 @anubhava 的正则​​表达式。

示例:

$a = "POLYGON((1 1,2 2,3 3,1 1),(1 1,2 2,3 3,1 1),(1 1,2 2,3 3,1 1))";

如果这个正则表达式的打印结果你会得到这样......

Array
(
    [0] => Array
        (
            [0] => ((1 1,2 2,3 3,1 1)
            [1] => (1 1,2 2,3 3,1 1)
            [2] => (1 1,2 2,3 3,1 1))
        )

    [1] => Array
        (
            [0] => 1 1,2 2,3 3,1 1
            [1] => 1 1,2 2,3 3,1 1
            [2] => 1 1,2 2,3 3,1 1
        )
)

看看第二个数组元素,它就像我们想要的那样。

仅供参考:我用它从MySQL数据库中获取POLYGON的GEOMETRY数据,然后用数组处理它以获得所有多边形节点的所有纬度和经度。

2 个答案:

答案 0 :(得分:3)

使用基于否定的正则表达式模式并从捕获的组#1中获取结果:

preg_match_all('/\(+([^()]*)\)+/', $a, $pat_array);
print_r($pat_array[1]);

[^()]*将匹配任何非()的字符。

<强>输出:

Array
(
    [0] => 1 1,2 2,3 3,1 1
)

答案 1 :(得分:1)

使用lookarounds

preg_match_all("/(?<=\()[^()]*(?=\))/U", $a, $pat_array);

参见演示。

https://regex101.com/r/vV1wW6/42