Не могу получить массив из строки, если перед скобками есть символы
"string1", "string2"
$string = "
iojefu { string1 }
asdjhu { string2 }
";
$array = preg_split('/\{|\}(.*)?/', $string, null, PREG_SPLIT_NO_EMPTY);
Ищем регуляркой строки внутри фигурных скобок, игнорируя опциональные пробелы вокруг строки:
$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]+.
Если не учитывать случаи вложенных скобок {{}}, то будет работать это:
$matches = [];
preg_match_all('/\{\s*([^}\s]*)\s*\}/', $string, $matches);
Результат будет в $matches[1]
Вы забыли про квантификаторы. Выражение \{|\} ищет ровно один символ, а вам нужно как минимум 3: {, } и то что между ними (без пробелов), а оно насколько я понял может содержать все кроме фигурных скобок. Так что вам нужно что-то вроде этого:
/[{]\s*([^{}]+)\s*[}]/
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"
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей