Массив данных из фигурных скобок в строке

260
30 марта 2017, 22:42

Не могу получить массив из строки, если перед скобками есть символы

"string1", "string2"
$string = "
    iojefu { string1 }
    asdjhu { string2 }
";
$array = preg_split('/\{|\}(.*)?/', $string, null, PREG_SPLIT_NO_EMPTY);
Answer 1

Ищем регуляркой строки внутри фигурных скобок, игнорируя опциональные пробелы вокруг строки:

$string = "
    iojefu { string1 }
    asdjhu { string2 }
";
preg_match_all('/\{\s*(?P<str>[^}]+?)\s*\}/', $string, $matches);
var_dump($matches['str']);
/*
array(2) {
  [0] => string(7) "string1"
  [1] => string(7) "string2"
}
*/

Конструкция (?P<name>pattern) (с 5.2.2 допустимы два новых варианта: (?<name>pattern) и (?'name'pattern)) даёт имя маски и результат будет доступен по одноимённому ключу массива выходных данных; за деталями можно сходить сюда http://php.net/manual/ru/regexp.reference.subpatterns.php

Сам шаблон поиска [^}]+? выбирает между скобками всё, что не является закрывающей фигурной скобкой. Для игнорирования конечного пробела использован ленивый квантификатор +?, но его можно заменить на жадный +, если добавить пробельные символы в список исключаемых в поиске - [^}\s]+.

Answer 2

Если не учитывать случаи вложенных скобок {{}}, то будет работать это:

$matches = [];
preg_match_all('/\{\s*([^}\s]*)\s*\}/', $string, $matches);

Результат будет в $matches[1]

Answer 3

Вы забыли про квантификаторы. Выражение \{|\} ищет ровно один символ, а вам нужно как минимум 3: {, } и то что между ними (без пробелов), а оно насколько я понял может содержать все кроме фигурных скобок. Так что вам нужно что-то вроде этого:

/[{]\s*([^{}]+)\s*[}]/
Answer 4

preg_match ищет совпадения по шаблону, а на выходе получается многомерный массив, что было лишним в моём случае

preg_split же исключает лишнее, в результате получается чистый одномерный массив

Добавил в выражение исключение пробелов и табуляции \s и исключение до скобок .*?

$array = preg_split('/.*?\{|\}|\s/', $string, null, PREG_SPLIT_NO_EMPTY);
array(2) {
    [0]=> string(7) "string1"
    [1]=> string(7) "string2"
}
READ ALSO
Как узнать размер изображения

Как узнать размер изображения

Подскажите, как сделать так чтобы при загрузке аватарки (изображения) меньше 200x200 выбивало ошибку?

161
Отображение подзаголовков в категории. PHP и MySQL

Отображение подзаголовков в категории. PHP и MySQL

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

191
Сохранение сессии через AJAX

Сохранение сессии через AJAX

Допустим у нас есть 2 файла:

168
Использование системы пользователей WordPress в стороннем проекте

Использование системы пользователей WordPress в стороннем проекте

Необходимо реализовать доступ к стороннему проекту через систему пользователей WordPressПример: пользователь вводит данные от своего аккаунта...

181