从兼容性的JSON阵列支架拆分短码支架

时间:2018-01-26 22:57:26

标签: php regex

一般来说,我很难在基本匹配之外使用正则表达式。我有一个简单的短代码解析器,类似于Wordpress的一个例子:

~PLUGIN::name_of_plugin["param1"="value1","param2"="value2"]~

我有这种分裂和工作,我只是在explode()上使用[并修剪]以获取参数部分。现在,我想传递一个嵌套数组,所以我试图将JSON对象改为这些括号,所以要解析的字符串将如下所示:

$str    =   '~PLUGIN::name_of_plugin[{
            "category":"whatever",
            "test":[{
                    "name":"Title Something",
                    "desc":"123123-A",
                    "result":"Confirmation",
                    "conforms":"true",
                    "mass_spec":"true"
                }]
        }]~';

在经历了一系列不同的模式尝试并取得了不同程度的成功之后,我想到的就是我会考虑 useable

preg_match('/^\~([a-z]+::)([a-z\_\-]+)([^\~]+)\~/i',$str,$match);
print_r($match);

它与此匹配(我可以根据需要修剪键3):

Array
(
    [0] => ~PLUGIN::name_of_plugin[{
                "category":"whatever",
                "test":[{
                        "name":"Title Something",
                        "desc":"123123-A",
                        "result":"Confirmation",
                        "conforms":"true",
                        "mass_spec":"true"
                    }]
            }]~
    [1] => PLUGIN::
    [2] => name_of_plugin
    [3] => [{
                "category":"whatever",
                "test":[{
                    "name":"Title Something",
                    "desc":"123123-A",
                    "result":"Confirmation",
                    "conforms":"true",
                    "mass_spec":"true"
                }]
            }]
)

问题是,如果短代码没有像:

这样的参数
$str    =   '~PLUGIN::name_test~';

它拆分为此(请注意密钥n中的3):

Array
(
    [0] => ~PLUGIN::name_of_plugin~
    [1] => PLUGIN::
    [2] => name_of_plugi
    [3] => n
)

我应该做些什么样的前瞻性的事情,这会让它分裂成:

Array
(
    [0] => ~PLUGIN::name_of_plugin~
    [1] => PLUGIN::
    [2] => name_of_plugin
)

但是当它存在时会将参数块拆分掉吗?我试图在我implode()23之类的地方做某种黑客攻击。

1 个答案:

答案 0 :(得分:2)

似乎只需将最后一组设为可选项即可。我只在最后?之前添加了~

此外,~_不是特殊字符,因此无需转义它们。

我还为行尾$添加了锚点。如果你想确保它捕获整个字符串,通常是一个好主意。

^~([a-z]+::)([a-z_\-]+)([^~]+)?~$

看到它的工作:regex101