这是我的样本:
dummy json: {json here: "asdas"}
[[table
{json here: "asdas"}
]]
[[pre
{json here: "asdasx"}
]]
[[text {json here: "red"} ]]
我希望输出如下:
{json here: "asdas"}
{json here: "asdasx"}
{json here: "red"}
UPDATE json字符串可能包含大括号。
我只想获得所有的json字符串,但我一直都在失败
我尝试使用#\[\[(table|pre|text).+({.*?}).+\]\]#s
,但我得到了以下输出:
array(3) {
[0]=>
array(1) {
[0]=>
string(126) "[[table
{json here: "asdas"}
]]
[[pre
{json here: "asdasx"}
]]
[[text {json here: "red"} ]]"
}
[1]=>
array(1) {
[0]=>
string(5) "table"
}
[2]=>
array(1) {
[0]=>
string(18) "{json here: "red"}"
}
}
然后我用php语法preg_match_all
进行上述测试。
答案 0 :(得分:1)
我能够通过改变你的正则表达式来使代码工作:
\[\[(?:table|pre|text)\s*(\{.*?\})\s*\]\]
请注意,如果您打算使用括号,则需要对其进行转义;你在向我们展示的正则表达式中没有这样做。
<强>代码:强>
$userinfo = "[[table {json here: \"asdas\"}]] [[pre {json here: \"asdasx\"}]] [[text {json here: \"red\"} ]]";
preg_match_all ("/\[\[(?:table|pre|text)\s*(\{.*?\})\s*\]\]/", $userinfo, $pat_array);
print $pat_array[1][0]." <br> ".$pat_array[1][1]." <br> ".$pat_array[1][2];
<强>输出:强>
{json here: "asdas"} <br> {json here: "asdasx"} <br> {json here: "red"}
在这里演示:
答案 1 :(得分:1)
这是最快最简单的模式:\[\[\S+\s+\K{.*}
(Pattern Demo)
说明:
\[\[ #Match 2 opening square brackets
\S+ #Match 1 or more non-white-space characters
\s+ #Match 1 or more white-space characters
\K #Start the fullstring match from this point (avoiding capture group)
{.*} #Greedily match 0 or more non-line-terminating characters wrapped in curly brackets
*花括号不需要在我的模式中进行转义,因为它们不会被误认为是量词。
考虑到我的代码中的输入值($in
),我的模式只需 33 步骤。 Tim的模式采用 116 步骤并使用捕获组,使preg_match_all()
的输出数组大两倍。 inarilo的模式采用 125 步骤并使用捕获组。
如果有人特别想拥有一个捕获组,可以使用此方法:/\[\[\S+\s+({.*})/
仅花费 36 步骤。
代码(PHP Demo):
$in='dummy json: {json here: "asdas"}
[[table
{json here: "asd{as}"}
]]
[[pre
{json here: "asdasx"}
]]
[[text {json here: "red"} ]]';
echo implode('<br>',(preg_match_all('/\[\[\S+\s+\K{.*}/',$in,$out)?$out[0]:[]));
输出:
{json here: "asd{as}"}<br>{json here: "asdasx"}<br>{json here: "red"}
答案 2 :(得分:0)
试试这个正则表达式:
#^\[\[(?:table|pre|text)\s+(\{.*?\})\s+\]\]$#m
删除了全局修饰符,因为您使用的是preg_match_all。
答案 3 :(得分:0)
以下应该工作:
(\[\[[(table|pre|text) ]*[\n ].*)({.*})
https://regex101.com/r/Yv67gb/1
这会缩小示例范围,以[[table
或[[pre
或[[text
开头,然后使用{
开始json,其结尾为}
包含文本介于两者之间。
第2组将是我们的结果。
{json here: "asdas"}
{json here: "asdasx"}
{json here: "red"}