正则表达式 - 匹配[[[和]]]之间的任何数字的倍数

时间:2012-09-10 13:42:42

标签: php regex

我需要使用正则表达式匹配[[[和]]之间的任何内容。然后我需要将括号中找到的所有值放入数组中。

示例文字:

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]]]

但不是最后一个,因为它只有两个[最后。

5 个答案:

答案 0 :(得分:2)

这会检查:

  1. [[[
  2. 其次是:
    1. ] - 或 -
    2. 之外的任何内容
    3. 未跟]
    4. 的一到两个]
  3. 后跟]]]
  4. 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”模式运行表达式。

另请参阅:http://rubular.com/r/QFo9jHEh9d

答案 2 :(得分:1)

更安全的解决方案:

\[{3}[^\]]+?\]{3}

答案 3 :(得分:0)

我认为这有效:

\[\[\[(.*)\]\]\]

但这可能是新方法:)

答案 4 :(得分:0)

如果您的字符串始终遵循该格式subjectsizeposition,则可以使用此字符:

$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);