我需要使用正则表达式匹配[[[和]]之间的任何内容。然后我需要将括号中找到的所有值放入数组中。
示例文字:
here is some 'test text [[[media-2 large right]]], [[[image-0 large left]]] the another token [[[image-1]]
从上面的文字我需要匹配前两个:
1, [[[media-2 large right]]]
2, [[[image-0 large left]]]
但不是最后一个,因为它只有两个[最后。
答案 0 :(得分:2)
这会检查:
[[[
]
- 或 - ]
]
]]]
preg_match_all('/\[\[\[(?:(?:[^\]]*|]{1,2}(?!]))*)]]]/', $string, $matches);
print_r($matches[0]);
此正则表达式的好处是可以在三支架包装内部匹配]
(例如[[[foo]bar]]]
。
注意: ]
不需要转义,但在字符类中除外。
答案 1 :(得分:2)
这是一个通用的解决方案:
\[{3}(?=.*?\]{3}(?!\]))((?:(?!\]{3}(?!\])).)*)
它读取
\[{3} # 3 opening square brackets
(?= # begin positive look-ahead ("followed by..."
.*?\]{3} # ...3 closing brackets, anywhere ahead (*see explanation below)
(?!\]) # negative look-ahead: no more ] after the 3rd one
) # end positive look-ahead
( # begin group 1
(?: # begin non-matching group (for atomic grouping)
(?! # begin negative look-ahead ("not followed by"):
\]{3} # ...3 closing square brackets
(?!\]) # negative look-ahead: no more ] after the 3rd one
) # end negative look-ahead
. # the next character is valid, match it
) # end non-matching group
) # end group 1 (will contain the wanted substring)
正向前瞻是一个safeguard子句,当长输入字符串中没有"]]]"
时,它允许表达式快速失败。
一旦确定"]]]"
将跟随字符串中的某个点,负向前瞻确保表达式正确匹配字符串,如下所示:
[[[foo [some text] bar]]]
^
+-------- most of the other solutions would stop at this point
此表达式检查每个字符是否跟随三个]
,因此在此示例中它将包含" bar"
。
表达式的"no more ] after the 3rd one"
部分确保匹配不会过早结束,因此在这种情况下:
[[[foo [some text]]]]
匹配仍为"foo [some text]"
没有它,表达式会过早停止("foo bar [some text"
)。
副作用是我们不需要实际匹配"]]]"
,因为积极的前瞻表明他们在那里。我们只需要匹配它们,负面的前瞻很好。
请注意,如果您的输入包含换行符,则需要以“dotall”模式运行表达式。
答案 2 :(得分:1)
更安全的解决方案:
\[{3}[^\]]+?\]{3}
答案 3 :(得分:0)
我认为这有效:
\[\[\[(.*)\]\]\]
但这可能是新方法:)
答案 4 :(得分:0)
如果您的字符串始终遵循该格式subject
,size
,position
,则可以使用此字符:
$string = "here is some 'test text [[[media-2 right]]], [[[image-0]]] the another [[[image-1 left large]]] and token [[[image-1]]";
preg_match_all('/[\[]{3}(.*?)(.*?)?(.*?)?[\]]{3}/', $string, $matches);
print_r($matches);