2012-07-04 3 views
0

Узор Я хочу, чтобы соответствовать это [{Any text between here}]Застрял с регулярным выражением

мое регулярное выражение:

/\[\{[\W\w]*?\}\]/ 

Я использую preg_match_all()

Он работает до сих пор, но мне было интересно, если есть лучше решение?

+4

Похоже, что вы пытаетесь разобрать JSON. Regex - это * не * решение для этого. –

ответ

2

Если вы хотите, чтобы найти матч, который включает в себя [{ и }] затем использовать

/\[\{[^}]+\}\]/ 

Если вы хотите матч только внутри текста, а затем использовать

/(?<=\[\{)[^}]+(?=\}\])/ 

If текст внутри может содержать } символ (например, [{hello} yellow}]), затем замените [^}]+ на .+? в обоих шаблонах регулярных выражений. Оригинальные модели имеют лучшую производительность, так как они не используют ленивого оператора ?.

+0

Это именно то, что я хотел. Спасибо –

+0

@AbdullahAAlmsaeed - Вы должны отметить этот ответ, как принято тогда. –

+0

Прошу прощения, сайт просил меня ждать 7 минут, и я забыл. Я сделал это сейчас;) –

1

использовать это регулярное выражение (?<=\[\{)(.+?)(?=\}\])

2

Вы могли бы упростить его

\[\{.*?\}\] 

или даже

\[{.*?}] 

, но кроме того, что это выглядит довольно хорошо.


Редактировать

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

При проведении обзора с помощью такого инструмента, как RegexBuddy, это регулярное выражение необходимо 21 шагов, чтобы прийти к решению, а @ решение Ωmega только требует 5 шагов.

+0

Ленивый оператор болит производительность и должен опускать, если возможно –

+1

@ Ωmega - Вы, кажется, правы в отношении производительности, но комментариев было бы достаточно. Вы должны зарезервировать понижающие голоса для ответов, которые являются неправильными. –

+0

Мир, мой друг –

1

Key "U" делает движок регулярных выражений не жадный:

preg_match_all('_\[{.*}\]_U', '[{safda}adsfsf}}][{safda}adsfsf}}]', &$matches); 

дает$matches:

Array 
(
    [0] => Array 
     (
      [0] => [{safda}adsfsf}}] 
      [1] => [{safda}adsfsf}}] 
     ) 

) 
+2

OP заявляет, что он использует 'preg_match_all()', поэтому было бы больше таких шаблонов в строке. Проверьте свой код с помощью примера ** [{safda} adsfsf}}] [{safda} adsfsf}}] ** и ... это плохо: -/ –

+0

Спасибо, исправлено это. – Oroboros102

+0

Отлично работает 2 матча. Ваш результат отличается? – Oroboros102

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