2011-01-10 55 views
4

我需要检查某个字符串的字符串,我想使用正则表达式来处理这个问题,但是我一直试图使用越多,就越容易混淆(并且让我失望)。我似乎无法做到。似乎无法得到正确的正则表达式

我需要表达时,该字符串包含这样的返回true:[[module:instance]],但它需要满足以下条件:

  • 始终打开与2个支架[[
  • 两个支架后,字符串可以包含除:一切,并没有限制它的长度
  • 后串1个:字符必须存在
  • 0后再次,它可以包含一切,除了一个:,并没有限制它一个字符串的长度
  • 始终关闭2个支架]]

任何帮助,提示,好的教程,任何将不胜感激!

在此先感谢!

+0

只是评论 - 正则表达式的执行措施的速度和尝试做同样没有正则表达式。我有一种感觉,没有正则表达式的直接变体可以更快。 – 2011-01-10 21:23:52

+0

`[[a [[b:c]] d]``应该匹配什么? – Gumbo 2011-01-10 21:32:34

回答

6

试试这个:

preg_match('/\[\[[^:]+?:[^:]+?]]/', $str, $match) 

的解释:

  • \[\[匹配字面[[
  • [^:]+?匹配任何不是:(非贪婪)
  • :匹配字面:
  • [^:]+?匹配任何不是:(非贪婪)
  • ]]匹配的文字]]
1

尝试此您正则表达式:因为他们的元字符喜欢

\[\[.*?:[^:]*?\]\] 

有反斜杠,方括号之前需要,*和?。

+0

这也会匹配`[[:::: module:]]`,不是吗? – 2011-01-10 21:12:54

+0

否。一旦达到第一个`:`,第一个非贪婪匹配就会停止,中间`:`是必需的,而最后一个组匹配*,但是*`:`。然而,[[:]]确实匹配(不确定OP是否需要)。 – Jacob 2011-01-10 21:16:38

0

\[\[[^:]+\:[^:]+\]\]怎么样?那样有用吗?

应该匹配两个文字[字符,那么任何字符未:至少重复一次,然后:,那么,是不是:至少一次,然后2字面中]任何字符。

2
\[\[[^:]+:[^:]+\]\] 

说明:

\[\[匹配两个开放支架。

[^:]匹配任意一个字符除了冒号。

[^:]+匹配一个或多个字符,除了冒号。

0

这项工作?

[[[^:] :{1} [^:]]

相关问题