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+)="([^"]+)"
示例
$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
)
)
我正在尝试找到一个能够捕获 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+)="([^"]+)"
示例
$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
)
)