2011-01-10 1 views
4

Мне нужно проверить строку для определенной строки, я хочу использовать регулярное выражение для этого, но чем больше я стараюсь, тем больше он меня смущает (и расстраивает); Кажется, я не понимаю.Не похоже, чтобы шаблон регулярного выражения был правильным

Мне нужно выражение возвращает истину, если строка содержит что-то вроде этого: [[module:instance]], но она должна удовлетворять следующие условия:

  • Всегда открыт с 2 кронштейнами [[
  • После двух скобок строка может содержать все, кроме :, и не имеет никаких ограничений на его длину
  • После строки 1 : символа должен присутствовать
  • После : снова строка, которая может содержать все, кроме :, и не имеет никаких ограничений на его длина
  • Всегда рядом с 2 Кронштейны ]]

Любая помощь, советы, хорошие учебники, все было бы весьма признателен!

Заранее благодарен!

+0

Просто комментарий - скорость мера выполнения регулярных выражений и попытаться сделать то же самое без регулярных выражений. У меня такое ощущение, что простой вариант без регулярного выражения может быть быстрее. –

+0

Что должно быть сопоставлено в '[[a [[b: c]] d]]'? – Gumbo

ответ

6

Попробуйте это:

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

Объяснение:

  • \[\[ соответствует буквальным [[
  • [^:]+? соответствует ничего, кроме : (не жадный)
  • : соответствует буквальному :
  • [^:]+? соответствует ничего, кроме : (не жадного)
  • ]] соответствует буквальному ]].
+0

Работает как очарование! Принято из-за (четкого) объяснения (приятно знать, что и как я это делаю! Большое спасибо!) –

+0

Почему вы используете \\ [\\ [для сопоставления с буквальным [[в начале, но используйте] ] в конце]] в конце? Просто пытаясь научиться ... не подвергая сомнению точность вашего ответа ... –

+1

@Remnant: вы избежите открытых скобок в начале, иначе они будут интерпретироваться как начало класса символов. В то время как закрывающая скобка не имеет никакого специального значения вне класса символов и не нуждается в экранировании. –

1

Попробуйте это для регулярных выражений:

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

Обратные косые черты необходимы прежде, чем квадратные скобки, поскольку они метасимволы нравится, * и.?.

+0

Это также будет соответствовать '[[:::: module:]]', не так ли? –

+0

Нет. Нежелательное совпадение на первом останавливается после достижения первого ':', требуется средняя команда ':', а последняя группа соответствует всем *, но * ':'. Однако [[:]] соответствует (не уверен, хочет ли OP это или нет). – Jacob

+0

Ты прав, @ Якоб, я забыл о не-жадности! –

0

Как насчет \[\[[^:]+\:[^:]+\]\]? Это работает?

Он должен соответствовать двум буквенные [ символов, то любой символ, который не : повторяется по крайней мере один раз, то :, то любой символ, который не : по крайней мере один раз, а затем два буквальных ] символов.

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

Пояснение:

\[\[ соответствует два открывающих скобок.

[^:] соответствует любому один знак, за исключением двоеточия.

[^:]+ совпадения один или несколько символов, за исключением колоний.

+0

Это также будет соответствовать «[[a [[b: c]] d]] '. – Gumbo

+0

@Gumbo, и это будет нормально: строка 1 и строка 2 могут содержать что угодно, кроме точки с запятой, и это позволяет использовать двойные скобки. –

+0

@ Gumbo Будет. Но искатель никогда не говорил, что это не должно быть :) –

0

Будет ли это работать?

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

Смежные вопросы