【问题标题】:PHP - Preg Match All - Wordpress Multiple short codes with multiple parametersPHP - Preg 匹配所有 - Wordpress 多个带有多个参数的短代码
【发布时间】:2021-03-15 16:27:18
【问题描述】:

我正在尝试找到一个能够捕获 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)
   )

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

你知道我是如何做到这一点的吗?

谢谢 洛朗

【问题讨论】:

  • 您期望的 exact 数组输出是什么?
  • 但它确实匹配了您想要的所有部分,对吧? regex101.com/r/v8l4X9/1
  • @Laurent 我写了一个模式的变体3v4l.org/6FbEO 或者你的意思是第一个子数组中只有两个条目?
  • @Laurent 也许您可以使用 3 个数组,其中第一个具有短代码名称,第二个和第三个具有键和值。 3v4l.org/RdRro
  • @Thefourthbird 啊,那很好,你说得对,我可能应该寻找这种替代方案,而不是最终得到一个不可读的正则表达式。我试试看!

标签: php preg-match-all


【解决方案1】:

您可以使用 3 个捕获组来使用 \G 锚点,其中捕获组 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
        )

)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多