【问题标题】:php preg_replace not putting dash back in?php preg_replace 没有放回破折号?
【发布时间】:2021-03-03 03:50:23
【问题描述】:

所以,我正在对 lat/long 对进行一些操作,我需要将其转为:

39.1889375383777,-94.48019109594397

进入:

39.1889375383777 -94.48019109594397

我不能使用 str_replace,除非我想要一个包含 10 个搜索和 10 个替换字符串的数组,所以我希望使用 preg_replace:

$query1 = preg_replace( "/([0-9-]),([0-9-])/", "\1 \2", $query ); 

问题是“-”丢失了:

39.1889375383777 94.48019109594397

请注意,我有一个包含这些列表的字符串,试图一次完成所有操作:

[[39.1889375383777,-94.48019109594397],[39.18425796890108,-94.28288005131176],[39.41972019529712,-94.19956344733345],[39.41412315915102,-94.41932608390658],[39.34785744845041,-94.4893603307242],[39.1889375383777,-94.48019109594397]] P>

我设法用 preg_replace_callback 完成了这项工作:

$str = preg_replace_callback( "/([0-9-]),([0-9-])/", 
               function ($matches) {return $matches[1] . " " . $matches[2];},
               $query
               );

但仍然不确定为什么更简单的 preg_match 不起作用?

【问题讨论】:

    标签: php regex preg-replace preg-replace-callback


    【解决方案1】:

    您的主要问题是"\1 \2" 定义了一个"\x1\x20\x2" 字符串,其中第一个字符是SOH 字符,第三个字符是STX 字符(请参阅ASCII table)。要定义反向引用,您需要使用文字反斜杠 "\\",或者更好的是使用 $n 表示法,最好在单引号字符串文字中使用。

    您也可以使用没有反向引用的解决方案:

    preg_replace('~(?<=\d),(?=-?\d)~', ' ', $str)
    

    详情:

    • (?&lt;=\d) - 前面紧跟数字的位置
    • , - 逗号
    • (?=-?\d) - 紧随其后的是可选的- 和一个数字的位置。

    PHP demo

    $str = '[[39.1889375383777,-94.48019109594397],[39.18425796890108,-94.28288005131176],[39.41972019529712,-94.19956344733345],[39.41412315915102,-94.41932608390658],[39.34785744845041,-94.4893603307242],[39.1889375383777,-94.48019109594397]]';
    echo preg_replace('~(?<=\d),(?=-?\d)~', ' ', $str);
    // => [[39.1889375383777 -94.48019109594397],[39.18425796890108 -94.28288005131176],[39.41972019529712 -94.19956344733345],[39.41412315915102 -94.41932608390658],[39.34785744845041 -94.4893603307242],[39.1889375383777 -94.48019109594397]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      相关资源
      最近更新 更多