2015-09-30 5 views
3

Я пытаюсь извлечь текст между фигурными фигурными скобками в PHP. напримерРегулярное выражение для извлечения текста между фигурными скобками

Добро пожаловать {$ user.first_name} в {$ site} версию 1.5. Ваше имя пользователя - {$ user.username}. Ваша репутация в настоящее время: {$ user.reputation.name}

Я использовал \{\$(.*?)\}, который отлично работает в некоторых случаях. Это соответствует:

  • {$ user.first_name}
  • {$} сайт
  • {$ user.username}
  • {$} user.reputation.name

Но теперь Я хочу совместить только текст, который имеет один или несколько. (точка) в фигурных скобках. то есть для приведенных выше строк, я должен быть в состоянии соответствовать только:

  • {$ user.first_name}
  • {$ user.username}
  • {$} user.reputation.name

Пожалуйста, помогите мне достичь этого! Заранее спасибо.

ответ

5

Вы можете использовать

\{\$([^.{}]+(?:\.[^.{}]+)+)\} 

См regex demo

Обратите внимание, что вместо ленивого точки, соответствующей .*?, я использую отрицанием класс [^.{}] символов, который соответствует любому символу, кроме ., { или }. Таким образом, мы сопоставляем любой блок, который не содержит ., и все еще находится в фигурных скобках.

Регулярного выражения пробой:

  • \{\$ - буквальный {$
  • ([^.{}]+(?:\.[^.{}]+)+) - Группа 1 соответствие
    • [^.{}]+ - 1 или больше символов, кроме ., { или }
    • (?:\.[^.{}]+)+ - 1 или более (из-за +) последовательности
      • \. - буквальная точка
      • [^.{}]+ - 1 или больше символов, кроме ., { или }
  • \} - буквальный }

IDEONE demo:

$re = '/\{\$([^.{}]+(?:\.[^.{}]+)+)\}/'; 
$str = "Welcome {\$user.first_name} to the {\$site} version 1.5. Your username is {\$user.username}. Your reputation at present is {\$user.reputation.name}"; 
preg_match_all($re, $str, $matches); 
print_r($matches[1]); 
+1

Отлично! Работает как шарм. Большое спасибо за ваш быстрый ответ и отличный ответ. :-) –

2

вы можете использовать этот шаблон:

~{\$([^}.]*+[^}]+)}~ 

[^}.]*+ имеет притяжательный квантор и не можете дать символов обратно, так [^}]+ может соответствовать только точке в качестве первого символа.

+0

Большое спасибо. Это выражение также работает для меня после замены ~ на \. Я использовал \ {\ $ ([^}.] * + [^}] +) \}, Чтобы проверить ваше выражение. –

+0

@AmitKumar: Вам не нужно делать эту замену. Вам также не нужно избегать фигурных скобок. –

+0

\ {\ $ ([^}.] * + [^}] +) \} Работает, но ~ {\ $ ([^}.] * + [^}] +)} ~ Не в моем тестовом коде PHP , –

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