一般来说,我很难在基本匹配之外使用正则表达式。我有一个简单的短代码解析器,类似于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()
键2
和3
之类的地方做某种黑客攻击。
答案 0 :(得分:2)
似乎只需将最后一组设为可选项即可。我只在最后?
之前添加了~
。
此外,~
和_
不是特殊字符,因此无需转义它们。
我还为行尾$
添加了锚点。如果你想确保它捕获整个字符串,通常是一个好主意。
^~([a-z]+::)([a-z_\-]+)([^~]+)?~$
看到它的工作:regex101