gpt4 book ai didi

php - 正则表达式解析文章中的自定义短代码子字符串并生成数组

转载 作者:行者123 更新时间:2023-12-04 01:12:47 26 4
gpt4 key购买 nike

我需要一些帮助来处理这个正则表达式。下面的正则表达式有效。

$regexgameid = '/{gameid\s([0-9][0-9][0-9][0-9][0-9])|([0-9][0-9][0-9][0-9][0-9])|([0-9][0-9][0-9][0-9][0-9])}/i';
preg_match_all($regexgameid, $articletext, $matchesgameid, PREG_SET_ORDER);

目标简码示例:{gameid 45735 76352 87262}

游戏 id 的数量可以是 1 或 3。

按照我的逻辑应该是这样的:

$regexgameid = '/{gameid\s([0-9]{5}){1,3}}/i';
preg_match_all($regexgameid, $articletext, $matchesgameid, PREG_SET_ORDER);

但是上面的正则表达式不起作用。


我想要实现的是从 preg_match_all() 中以这样的数组结构获取结果:

Array
(
[0] => {gameid
[1] => 45735
[2] => 76352
[3] => 87262
[4] => }
)

这样我就可以用有关 3 个游戏 ID 的信息替换文章文本中的整个 {gameid 45735 76352 87262} 简码。

最佳答案

这里演示了如何使用 preg_replace_callback() 替换您(我假设是 Joomla)文章中的 gameid 简码标签。

您在问题中说明 gameid 的数量要么是 1,要么是 3。因此,您不应使用 {1,3} 量词语法,因为它表示“一到三”而不是“一或三”。换句话说,正确的模式将要求第二个和第三个 ID 都存在/都不存在。

整个 shorttag 都是匹配的,所以你需要做的就是在原生函数的回调参数中指定翻译。

代码:(Demo)

$articleText = <<<TEXT
Some article text
Triple id: {gameid 45735 76352 87262}.
Do not honor {gameid 12345 67890} because contains exactly 2 game ids!
unknown id: {gameid 66666} can't replace it!
Found single id: {gameid 76352}
finished the article
TEXT;

$gamesLookup = [
45735 => 'Pac-man',
76352 => 'Donkey Kong',
87262 => 'Rampage'
];

echo preg_replace_callback(
'~{gameid (\d{5})(?: (\d{5}) (\d{5}))?}~',
function ($m) use ($gamesLookup) {
echo 'm = ' . var_export($m, true) . "\n---\n";
return 'Game Name(s): ' . strtr(implode(', ', array_slice($m, 1)), $gamesLookup);
},
$articleText
);

输出:(我正在打印匹配数组,这样你就可以看到你需要访问的数据)

m = array (
0 => '{gameid 45735 76352 87262}',
1 => '45735',
2 => '76352',
3 => '87262',
)
---
m = array (
0 => '{gameid 66666}',
1 => '66666',
)
---
m = array (
0 => '{gameid 76352}',
1 => '76352',
)
---
Some article text
Triple id: Game Name(s): Pac-man, Donkey Kong, Rampage.
Do not honor {gameid 12345 67890} because contains exactly 2 game ids!
unknown id: Game Name(s): 66666 can't replace it!
Found single id: Game Name(s): Donkey Kong
finished the article

如果您只是想要一个preg_match_all() 调用,那么相同的模式就足够了...

代码:(Demo)

var_export(
preg_match_all('~{gameid (\d{5})(?: (\d{5}) (\d{5}))?}~', $articleText, $m, PREG_SET_ORDER)
? $m
: []
);

关于php - 正则表达式解析文章中的自定义短代码子字符串并生成数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64301844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com