【问题标题】:How to use php preg_split to split a string and keep part of the used delimiter?如何使用 php preg_split 拆分字符串并保留部分使用的分隔符?
【发布时间】:2015-02-06 16:32:41
【问题描述】:

我需要使用 preg_split 通过使用 "};{" 作为分隔符来拆分下面的字符串。但我想在返回的数组中保留/返回 }{

Regex 可以做很多事情,但想知道使用 preg_split 是否可以做到这一点。

{'aid':10,'aSL'{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0},'hs':'4.8','l_p':1229241600},{'aid':80,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':100,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':30,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}},{'aid':40,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':60,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}}

我希望它像这样返回

[0] => {'aid':10,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0},'hs':'4.8','l_p':1229241600}
[1] => {'aid':80,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}
[2] => {'aid':100,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}
[3] => {'aid':30,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}
[4] => {'aid':40,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}
[5] => {'aid':60,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}

【问题讨论】:

  • 这基本上是一个 json 字符串。为什么不将其视为 json 并解码为本机结构。提取您想要的任何位并从中重新编码为 json 会容易得多。
  • 是的,这就是我最终使用 json_decode 的方式,但仍然很好奇在使用 preg_split 或类似方法时如何保留部分分隔符。

标签: php regex


【解决方案1】:

要在拆分序列中不包含} {,可以改用lookarounds

(?<=}),(?={)(?<=});(?={)

Test at regex101.com


要与正则表达式函数一起使用,需要将其放入delimiters/pattern/

【讨论】:

  • 另外,值得一提的是,对于两个“,”的情况,可以一个接一个地发生(我们不是假设它是上面的 JSON,而是任何字符串,例如:},,,,{x},{y},,{),我们需要使用(?<=(?:}|,)),(?=(?:{|,))(?<=(}|,)),(?=({|,)) - 所以我们也可以在字符之前/之后包含逗号。
【解决方案2】:

您可以使用 Regex 向后看和向前看:

<?php

$string = "{'aid':10,'aSL'{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0},'hs':'4.8','l_p':1229241600},{'aid':80,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':100,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':30,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}},{'aid':40,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}},{'aid':60,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}}";

$matches = preg_split('/(?<=}),(?={)/', $string);

var_dump($matches);

返回:

array(6) {
  [0]=>
  string(92) "{'aid':10,'aSL'{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0},'hs':'4.8','l_p':1229241600}"
  [1]=>
  string(59) "{'aid':80,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}}"
  [2]=>
  string(60) "{'aid':100,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}}"
  [3]=>
  string(65) "{'aid':30,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}}"
  [4]=>
  string(59) "{'aid':40,'aSL':{'ac':0,'g_ac':0,'stats':0,'ldb':0,'g_':0}}"
  [5]=>
  string(65) "{'aid':60,'aSL':{'ac':true,'g_ac':true,'stats':0,'ldb':0,'g_':0}}"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多