PHP中preg_split分割GPS坐标时为何出现空元素?
问题原因分析
你的问题核心出在多字节字符的正则匹配兼容上。°是一个UTF-8多字节字符(占2个字节),而默认情况下preg_split采用单字节模式解析字符串,无法正确识别这个多字节符号,会把它拆成两个独立的字节处理。如果其中某个字节被正则字符集[°'\"]误匹配,就会在两个分隔符之间产生空元素,也就是你看到的索引1的空值。
解决办法
有两种简单有效的方式可以解决这个问题:
1. 添加UTF-8修饰符u
在正则表达式末尾加上u,让PHP正则引擎以UTF-8多字节模式解析字符串,这样就能正确识别°作为单个分隔符:
$long = "13°47'52.544\"E"; $res = preg_split("/[°'\"]/u", $long); // 结果:array(0=>13, 1=>47, 2=>52.544, 3=>E)
2. 使用PREG_SPLIT_NO_EMPTY过滤空元素
如果你不想纠结编码细节,可以直接在preg_split的第四个参数传入PREG_SPLIT_NO_EMPTY,让函数自动忽略拆分产生的空元素:
$long = "13°47'52.544\"E"; $res = preg_split("/[°'\"]/", $long, -1, PREG_SPLIT_NO_EMPTY); // 结果:array(0=>13, 1=>47, 2=>52.544, 3=>E)
两种方法都能得到你想要的干净数组,优先推荐第一种,因为它从根源上解决了多字节字符的匹配问题。
内容的提问来源于stack exchange,提问作者Skyfox
相关产品推荐
相关产品推荐

