PHP - Preg Match All - Wordpress 具有多个参数的多个短代码

PHP - Preg Match All - Wordpress Multiple short codes with multiple parameters

我正在尝试找到一个能够捕获 Wordpress 中生成的短代码内容的正则表达式。

我的短代码结构如下: [短代码名称 param1="value1" param2="value2" param3="value3"]

参数个数可变。

我需要捕获短代码名称、参数名称及其值。

我取得的最接近的结果是:

/(?:\[(.*?)|\G(?!^))(?=[^][]*])\h+([^\s=]+)="([^\s"]+)"/

如果我在同一个字符串中有以下内容:

[specs product="test" category="body"]

[pricelist keyword="216"]

[specs product="test2" category="network"]

我明白了:

0=>array(

    0=>[specs product="test"
    1=> category="body"
    2=>[pricelist keyword="216"
    3=>[specs product="test2"
    4=> category="network")

1=>array(
    0=>specs
    1=>
    2=>pricelist
    3=>specs
    4=>)
2=>array(
    0=>product
    1=>category
    2=>keyword
    3=>product
    4=>category)
3=>array(
   0=>test
   1=>body
   2=>216
   3=>test2
   4=>network)
   )

我尝试过不同的正则表达式模型,但我总是遇到同样的问题,如果我有多个参数,它就无法检测到它。

你知道我怎样才能做到这一点吗?

谢谢 洛朗

您可以使用 \G 锚点使用 3 个捕获组,其中捕获组 1 是短代码的名称,第 2 组和第 3 组是键值对。

然后可以删除数组的第一项,并删除第1、2、3项中的空项。

这是一个稍微更新的模式

(?:\[(?=[^][]*])(\w+)|\G(?!^))\h+(\w+)="([^"]+)"

Regex demo | Php demo

示例

$s = '[specs product="test" category="body"]';
$pattern = '/(?:\[(?=[^][]*])(\w+)|\G(?!^))\h+(\w+)="([^"]+)"/';

$strings = [
    '[specs product="test" category="body"]',
    '[pricelist keyword="216"]',
    '[specs product="test2" category="network" key="value"]'
];

foreach($strings as $s) {
    if (preg_match_all($pattern, $s, $matches)) {
        unset($matches[0]);
        $matches = array_map('array_filter', $matches);
        print_r($matches);
    }
}

输出

Array
(
    [1] => Array
        (
            [0] => specs
        )

    [2] => Array
        (
            [0] => product
            [1] => category
        )

    [3] => Array
        (
            [0] => test
            [1] => body
        )

)
Array
(
    [1] => Array
        (
            [0] => pricelist
        )

    [2] => Array
        (
            [0] => keyword
        )

    [3] => Array
        (
            [0] => 216
        )

)
Array
(
    [1] => Array
        (
            [0] => specs
        )

    [2] => Array
        (
            [0] => product
            [1] => category
            [2] => key
        )

    [3] => Array
        (
            [0] => test2
            [1] => network
            [2] => value
        )

)