[[和]]之间的PHP正则表达式preg_match_all()

[[和]]之间的PHP正则表达式preg_match_all(),php,regex,preg-match-all,Php,Regex,Preg Match All,我想使用preg_match_all()提取[[和]]之间的内容,但忽略[[和]]],因此,例如以下文本: $text = <<<TEXT Some text going here [[ 1. this is a text ]] another text but multiple lines [[ 2. this is a text ]] This should be ignored, haveing 3 on the left [[[ 3. this is a

我想使用preg_match_all()提取[[和]]之间的内容,但忽略[[和]]],因此,例如以下文本:

$text = <<<TEXT
Some text going here

[[ 1. this is a text ]]

another text but multiple lines

[[ 2. this 
is a 
text ]]

This should be ignored, haveing 3 on the left

[[[ 3. this is a text ]]

This should be ignored, haveing 3 on the right

[[ 4. this is a text ]]]

This should be ignored, haveing 3 both on the left and right

[[[ 5. this is a text ]]]

This is the final sentence.

[[ 6. this is a text ]]
TEXT;

if (preg_match_all("(?!<\[)(\[\[.*?\]\])(?!\[)", $text, $tags, PREG_PATTERN_ORDER)) {
        $tags = $tags[0];
}

echo '<pre>';
print_r(tags);
echo '</pre>';
$text=试试:

尝试:


您可以使用以下模式:

~(?<!\[)\[\[([^][]*)]](?!])~
preg\u match\u all('~(?
如果标记内不允许使用方括号,则图案可以缩短为:

((?<!\[)\[\[([^\[][^\]]*)\]\](?!\]))

~(?您可以使用此模式:

~(?<!\[)\[\[([^][]*)]](?!])~
preg\u match\u all('~(?
如果标记内不允许使用方括号,则图案可以缩短为:

((?<!\[)\[\[([^\[][^\]]*)\]\](?!\]))

~(?这里有一个正则表达式可以完成这项工作:

(?
分解这个

  • 任何不是由一个[
  • [[
  • 任何字符,但[
  • 任何字符,但]0次或更多次
  • ]]
  • 后面不跟a]

这应该是防弹的,但它需要至少1个介于[[和]]之间的字符。

这里有一个正则表达式可以完成这项工作:

(?
分解这个

  • 任何不是由一个[
  • [[
  • 任何字符,但[
  • 任何字符,但]0次或更多次
  • ]]
  • 后面不跟a]


这应该是防弹的,但它需要至少1个介于[[和]]之间的字符。

做得很好。必须用lookarounds完成。为您创建了一个工作示例:非常感谢!它工作得很好!Regex非常复杂,仍在学习:)@r3mus:谢谢你的例子。它是最优雅的,你没有为了吸引注意而建造一堵巨大的代码墙;@r3mus:但是如果你愿意,如果你使用详细模式(\x)、子模式定义(
((DEFINE)(?…)(?…)(?)(?)
),你可以用一个模式建造一堵代码墙和注释。它不太简洁,但更具可读性(对长模式也很有用)。做得很好。必须用lookarounds完成。为您创建了一个工作示例:非常感谢!它工作得很好!正则表达式非常复杂,仍在学习:)@r3mus:谢谢你的例子。它是最优雅的,你没有为了吸引注意而建造一堵巨大的代码墙;@r3mus:但是如果你愿意,如果你使用详细模式(\x)、子模式定义(
((DEFINE)(?…)(?…)(?)(?)
),你可以用一个模式建造一堵代码墙和注释。它不太简洁,但更具可读性(并且对长模式更有用)。3.不应该匹配,6.应该。这是一个错误的答案。抱歉,尝试了但选择了所有内容:(@user702300,即使在更新之后?更新之后,如果之前没有字符,它将不匹配[[@DanielGimenez updated.3.不应该匹配,6应该匹配。这是一个错误的答案。抱歉,已尝试但选择了所有内容:(@user702300,即使在更新之后?更新之后,如果之前没有字符,则将不匹配[[@DanielGimenez更新。谢谢,它运行得非常好!只需选择由@Casimir et Hippolythank首先给出的正确答案。谢谢,它运行得非常好!只需选择由@Casimir et Hippolyte首先给出的正确答案
((?<!\[)\[\[([^\[][^\]]*)\]\](?!\]))