【问题标题】:Regular expression needed for PHP preg_splitPHP preg_split 需要的正则表达式
【发布时间】:2013-06-13 09:12:25
【问题描述】:

我需要有关 PHP 正则表达式的帮助。 我有一个包含大量数据的字符串,格式可能是这样的。

key=value,e4354ahj\,=awet3,asdfa\=asdfa=23f23

所以我有 2 个分隔符,并且 = where 是键和值的集合。问题是 key 和 value 可以包含相同的符号 和 = 但它们总是会被转义。所以我不能使用爆炸。我需要使用 preg_split 但我不擅长正则表达式。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: php regex preg-split


    【解决方案1】:

    你需要使用negative lookbehind:

    // 4 backslashes because they are in a PHP string, so PHP translates them to \\
    // and then the regex engine translates the \\ to a literal \
    $keyValuePairs = preg_split('/(?<!\\\\),/', $input);
    

    这将在每个未转义的, 上拆分,因此您将获得键值对。您可以对每一对执行相同的操作来分隔键和值:

    list($key, $value) = preg_split('/(?<!\\\\)=/', $pair);
    

    See it in action.

    【讨论】:

      【解决方案2】:

      @Jon 的回答很棒。我想通过匹配字符串来提供解决方案:

      preg_match_all('#(.*?)(?<!\\\\)=(.*?)(?:(?<!\\\\),|$)#', $string, $m);
      // You'll find the keys in $m[1] and the values in $m[2]
      $array = array_combine($m[1], $m[2]);
      print_r($array);
      

      输出:

      Array
      (
          [key] => value
          [e4354ahj\,] => awet3
          [asdfa\=asdfa] => 23f23
      )
      

      说明:

      • (.*?)(?&lt;!\\\\)= :匹配任何内容并将其分组,直到 = 前面没有 \
      • (.*?)(?:(?&lt;!\\\\),|$) :匹配任何内容并将其分组,直到 , 前面没有 \ 或行尾。

      【讨论】:

      • 这很好用,很方便,触感很好。唯一的缺点是这样的代码必须伴随着大量的 cmets。
      • @Jon 我正在写一个preg_split 解决方案,但你更快:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2016-08-12
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多