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