【问题标题】:PHP preg_replace - regexPHP preg_replace - 正则表达式
【发布时间】:2023-04-10 07:09:02
【问题描述】:

我仍在研究正则表达式并一点一点地学习。这个让我头疼。我有一个类似下面的字符串:

".......mapsearch"), '52.486683, -4.044363', options......"

我想从字符串中检索 2 个数字(long 和 lat)——我不介意我是否将它们作为一个完整的字符串一起检索,中间包含逗号和空格。

我知道我想使用表达式来匹配并忽略从开始到 mapsearch"), ' 的任何内容,包括字符串的结尾到 ', options 模式。

更新

该字符串还将包含一系列其他字符,例如 { } ( ) = : / 以及所需匹配前后的数字..

【问题讨论】:

  • 为什么不在,上爆炸,然后循环检查它是否是一个浮点数/整数来保留它?
  • 字符串中只有这两个数字吗?
  • 这是 CSV 文件中的一行吗?你最好使用解析器。
  • @将发布更长的字符串。

标签: php regex preg-replace


【解决方案1】:

这会起作用,尽管它很丑:

/mapsearch\"\), '(-?\d+(?:\.\d+)?), (-?\d+(?:\.\d+)?)', options/

数字可以是负数或正数,也可以匹配整数和十进制值。该模式会将这两个数字作为一个单独的组返回。

【讨论】:

  • (-?\d+(?:.\d+)?) 工作原理的细分:-? 查找一个可选的前导负号,后跟多个数字 (\d+)。在最初的一组数字之后,我们想要匹配一个小数和一个数字的数量((?:.\d+)?),但我们不希望它是它自己的捕获组(?:)。
  • 返回一个包含 3 个项目的数组 - 其中第一个,第二个和第三个返回每个变量 - 仍然有效。谢谢。
  • preg_match(以及我见过的大多数其他正则表达式匹配器)将始终将完整匹配作为第一组返回。这就是为什么有 3 个项目。
【解决方案2】:
preg_match("/'([^,]+), ([^']+)'/", $string, $matches);
echo $matches[0]; // 52.486683
echo $matches[1]; // -4.044363

【讨论】:

    【解决方案3】:

    假设它是单引号中唯一的数字:

    '-?\d+.\d+, -?\d+.\d+'
    

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      (\-?[0-9]+\.[0-9]+\,\ \-?[0-9]+\.[0-9]+)
      

      提取

      52.486683,-4.044363

      【讨论】:

        【解决方案5】:

        在这种情况下,我会使用 metalfrog 的解决方案并进行一些更改。

        如果你确定只有字符串有逗号,没有别的,然后分解,检查它是否是整数/浮点数,或者如果你知道它是第 n 项,只需获取 $array[$n]。

        否则爆炸并使用this(需要一些编辑)来确定它是否是一个坐标。

        【讨论】:

          【解决方案6】:
          $subject = ".....mapsearch\"), '52.486683, -4.044363', options......";
          $regex = '/mapsearch\"\), \'(-?[0-9]{1,3}\.[0-9]{6}, -?[0-9]{1,3}\.[0-9]{6})\', options/';
          if (preg_match($regex, $subject, $matches)){
              print_r($matches);
          

          这会给你:

          Array
          (
              [0] => mapsearch"), '52.486683, -4.044363', options
              [1] => 52.486683, -4.044363
          )
          

          【讨论】:

            猜你喜欢
            • 2011-05-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-11
            • 2011-04-11
            • 1970-01-01
            相关资源
            最近更新 更多