Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式缺少捕获组_Php_Regex - Fatal编程技术网

PHP正则表达式缺少捕获组

PHP正则表达式缺少捕获组,php,regex,Php,Regex,我试图解析几个坐标,但PHP preg_match缺少一个捕获组。它可以在我测试过的每个正则表达式模拟器中工作,但不能在我的代码中工作。第四组总是空出来 $coordinates = 'N40.765775° E8.303369°'; // -40.765775° -8.303369° // 40.765775° 8.303369° // -40.765775° 8.303369° // N40.765775° E8.303369° // S40.765775° E8.303369

我试图解析几个坐标,但PHP preg_match缺少一个捕获组。它可以在我测试过的每个正则表达式模拟器中工作,但不能在我的代码中工作。第四组总是空出来

$coordinates = 'N40.765775°  E8.303369°';
// -40.765775°  -8.303369°
//  40.765775°  8.303369°
// -40.765775°  8.303369°
// N40.765775°  E8.303369°
// S40.765775°  E8.303369°
// N40.765775°  W8.303369°
// S40.765775°  W8.303369°

$regex = '/([-NnSs]?)\D*([0-9]?[0-9])\.(\d{1,10}+)\D\h*([-EeWw]?)\D*([0-1]?[0-9]?[0-9])\.(\d{1,10}+)/';
if (preg_match($regex, $coordinates, $matches)) {
    print_r($matches);
} else {
    echo "no matches";
}

由于您正在分析具有多字节字符(°)的字符串,因此应该在正则表达式的末尾添加unicode,即
u

/      /u
如图所示:如果不使用该修饰符,请在
\D
之后添加一个
,如下所示:

\D.\h*([-EeWw]?)

。。。然后,您将在第四个捕获组中捕获“E”。因此
\D.
实际上与多字节字符
°

匹配,因为您正在解析具有多字节字符(°)的字符串,所以应该在正则表达式的末尾添加unicode,即
u

/      /u
如图所示:如果不使用该修饰符,请在
\D
之后添加一个
,如下所示:

\D.\h*([-EeWw]?)

。。。然后,您将在第四个捕获组中捕获“E”。因此
\D.
实际上与多字节字符
°

匹配。您可以像trincot所说的那样使用
u
修饰符,或者将
\D
更改为
\S*
。与您的问题无关:0和1之间没有字符,您可以编写
[01]
,您不需要使用范围
[0-1]
。您也不需要将
\d{1,10}+
设为所有格,因为第一个后接
\d
,第二个位于模式的末尾,所以
\d{1,10}
。当只有一个数字时,写入
[0-9][0-9]?
[0-9]{1,2}
比写入
[0-9]?[0-9]
减少了所需的步骤数。您还可以使用i修饰符忽略大小写。坐标值是否曾经是这样的:
N040.[其余]
?我想不会吧。您的前导/可选数字范围不能更精确吗
[1-9]?
以及模式中的更高版本:
1?
?您可以使用trincot所说的
u
修饰符,或者将
\D
更改为
\S*
。与您的问题无关:0和1之间没有字符,您可以编写
[01]
,您不需要使用范围
[0-1]
。您也不需要将
\d{1,10}+
设为所有格,因为第一个后接
\d
,第二个位于模式的末尾,所以
\d{1,10}
。当只有一个数字时,写入
[0-9][0-9]?
[0-9]{1,2}
比写入
[0-9]?[0-9]
减少了所需的步骤数。您还可以使用i修饰符忽略大小写。坐标值是否曾经是这样的:
N040.[其余]
?我想不会吧。您的前导/可选数字范围不能更精确吗<代码>[1-9]?以及模式中的更高版本:
1?