gpt4 book ai didi

PHP preg_match_all,检查和爆炸

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:35:03 27 4
gpt4 key购买 nike

我想检查 'n' 分解这个字符串:

{$gallery#pager/collectionName/imageName/manual/no_effect/foo1/foo2/.../fooN}

到:

var_name[0] => 'gallery',
modul_name[0] => 'pager',
3[0] => 'collectionName',
4[0] => 'imageName',
5[0] => 'manual'
...
N[0] => 'fooN'

我制作了以下正则表达式:

/{\$(?P<var_name>[^#]+)#(?P<module_name>[^\/]+)(?:\/(\w+)(?:\/(\w+)(?:\/(\w+)(?:\/(\w+)(?:\/(\w+))?)?)?)?)?}/

,但是太丑了,最多只支持五个参数。请帮我做一个递归部分来提取所有参数。

ps: 是的,我可以将其拆分为var_namemodule_nameparamters 部分,然后我可以展开parameters 由 '/' 分隔,但我不喜欢它。

最佳答案

你可以使用 preg_split() .

正则表达式:

preg_split('@([$#])|[{}/]+@', $text)

并丢弃数组中的第一项和第三项。

ideone Demo



编辑:为了反射(reflect) OP 在评论中指定的新条件(不是在问题中):它应该验证语法 ^\{\$\w+#\w+(?:/\w*)$ 并在 var模块参数 中独立标记。 p>

正则表达式:

~\G(?(?=^)\{\$(\w++)#(\w++)(?=[\w/]+}$))/\K\w*+~

代码:

// http://stackoverflow.com/q/32969465/5290909

$pattern = '@\G(?(?=^)\{\$(\w++)#(\w++)(?=[\w/]+}$))/\K\w*+@';
$text = '{$gallery#pager/collectionName/imageName/manual/no_effect/foo1/foo2/fooN}';

$result = preg_match_all($pattern, $text, $matches);

if ($result === 0) {
// is invalid, does not match '~^\{\$\w+#\w+(?:/\w*)+$~'
echo "Invalid text";
} else {
// Assign vars (only to clarify)
$module_name = array_pop($matches)[0];
$var_name = array_pop($matches)[0];
$parameters = $matches;

echo "VAR NAME: \t'$var_name'\nMODULE: \t'$module_name'\nPARAMETERS:\n";
print_r($matches);
}

输出:

VAR NAME:   'gallery'
MODULE: 'pager'
PARAMETERS:
Array
(
[0] => collectionName
[1] => imageName
[2] => manual
[3] => no_effect
[4] => foo1
[5] => foo2
[6] => fooN
)

ideone Demo

关于PHP preg_match_all,检查和爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32969465/

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