正则表达式来解析注释块并解析其内容

问题描述 投票:0回答:1

我想要一个正则表达式来查看这样的字符串,从每个注释块中获取“card”值,并且如果存在“disabled”:true或“hide”:true标记,则为TRUE(否则为false)并返回匹配项及其状态的数组。这是字符串的示例:

<!-- wp:genesis-custom-blocks/blockname {
    "card":"card name 1",
    "boxes":"multiple boxes",
    "selected":false,
    "hide":true} /-->

more content

<!-- wp:genesis-custom-blocks/blockname {
    "card":"card name 2",
    "boxes":"multiple boxes",
    "selected":false,
    "hide":true} /-->

<div>tags, etc</div>

<!-- wp:genesis-custom-blocks/blockname2 {
    "card":"card name 4",
    "boxes":"multiple boxes",
    "selected":false,
    "hide":true} /-->

<!-- wp:genesis-custom-blocks/blockname10 {
    "selected":false} /-->

<!-- wp:genesis-custom-blocks/blockname2 {
    "card":"card name 6",
    "selected":false} /-->

other content

<!-- wp:genesis-custom-blocks/blockname2 {
    "card":"card name 5",
    "boxes":"multiple boxes",
    "selected":false,
    "disabled":true} /--> 

<!-- wp:genesis-custom-blocks/blockname2 {
    "card":"card name 5",
    "boxes":"multiple boxes",
    "selected":false} /--> 

例如对于上面的字符串我想要:

[
    ["card name 1", true],
    ["card name 2", true],
    ["card name 4", true],
    ["card name 6", false],
    ["card name 5", true],
    ["card name 5", false]
]

我用过:

preg_match_all('/"card":"(.*?)"/m', $content, $matches);

它获取卡片的值,但不获取其他信息。最好的方法是什么?我知道它将使用某些版本的[隐藏|禁用]。如果有影响的话,“card”将始终是这些块中的第一个值。

php regex html-parsing
1个回答
0
投票

使用正则表达式匹配注释块,并从其中获取 JSON。然后你可以使用

json_decode()
来解析它。

preg_match_all('#<!-- wp:genesis-custom-blocks/blockname\d* (.*?) /-->#s', $content, $matches);
$results = array_map(fn ($json) => json_decode($json, true), $matches[1]);
var_dump($results);

输出:

array(7) {
  [0]=>
  array(4) {
    ["card"]=>
    string(11) "card name 1"
    ["boxes"]=>
    string(14) "multiple boxes"
    ["selected"]=>
    bool(false)
    ["hide"]=>
    bool(true)
  }
  [1]=>
  array(4) {
    ["card"]=>
    string(11) "card name 2"
    ["boxes"]=>
    string(14) "multiple boxes"
    ["selected"]=>
    bool(false)
    ["hide"]=>
    bool(true)
  }
  [2]=>
  array(4) {
    ["card"]=>
    string(11) "card name 4"
    ["boxes"]=>
    string(14) "multiple boxes"
    ["selected"]=>
    bool(false)
    ["hide"]=>
    bool(true)
  }
  [3]=>
  array(1) {
    ["selected"]=>
    bool(false)
  }
  [4]=>
  array(2) {
    ["card"]=>
    string(11) "card name 6"
    ["selected"]=>
    bool(false)
  }
  [5]=>
  array(4) {
    ["card"]=>
    string(11) "card name 5"
    ["boxes"]=>
    string(14) "multiple boxes"
    ["selected"]=>
    bool(false)
    ["disabled"]=>
    bool(true)
  }
  [6]=>
  array(3) {
    ["card"]=>
    string(11) "card name 5"
    ["boxes"]=>
    string(14) "multiple boxes"
    ["selected"]=>
    bool(false)
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.