Регулярные выражения в PHP: Как извлечь права доступа пользователя (rights), если они хранятся в виде строки с числовыми и буквенными индексами?
Права доступа пользователя нередко хранятся в виде компактной строки, где каждый символ или группа символов кодирует определённое разрешение. Например, строка может выглядеть так: `r1w0x1a_edit1b_view0`, где чередуются буквенные метки и числовые значения. Задача — извлечь все пары «ключ-значение» с помощью регулярных выражений в PHP.
## Пример строки с правами доступа
Предположим, строка прав выглядит следующим образом:
r1w0x1a_edit1b_view0
Здесь буквенные индексы (`r`, `w`, `x`, `a_edit`, `b_view`) соответствуют конкретным правам, а числа (`1`, `0`) — их значениям (разрешено/запрещено).
## Регулярное выражение для извлечения
Для извлечения всех пар используем функцию `preg_match_all()`:
php
$rights_string = ‘r1w0x1a_edit1b_view0’;
$pattern = ‘/([a-z_]+)(d+)/i’;
preg_match_all($pattern, $rights_string, $matches);
$rights = array_combine($matches[1], $matches[2]);
print_r($rights);
### Что делает это выражение:
— `([a-z_]+)` — захватывает буквенный индекс (латинские буквы и символ подчёркивания).
— `(d+)` — захватывает числовое значение, следующее сразу за индексом.
— Флаг `i` делает поиск нечувствительным к регистру.
## Результат
После выполнения кода массив `$rights` будет содержать:
Array
(
[r] => 1
[w] => 0
[x] => 1
[a_edit] => 1
[b_view] => 0
)
## Формирование CSV-строки
Чтобы сформировать одну строку для CSV, объединяем ключи и значения:
php
$csv_parts = [];
foreach ($rights as $key => $value) {
$csv_parts[] = $key . ‘=’ . $value;
}
$csv_line = implode(‘,’, $csv_parts);
echo $csv_line;
// Вывод: r=1,w=0,x=1,a_edit=1,b_view=0
Если нужна стандартная CSV-строка с отдельными столбцами:
php
$csv_line = implode(‘,’, array_values($rights));
// Вывод: 1,0,1,1,0
## Советы по усложнённым форматам
Если строка содержит разделители, например `r:1|w:0|x:1`, используйте:
php
$pattern = ‘/([a-z_]+):(d+)/i’;
Для строк с пробелами или смешанными разделителями добавьте `s*` между группами:
php
$pattern = ‘/([a-z_]+)s*[=:]s*(d+)/i’;
Таким образом, регулярные выражения в PHP позволяют гибко и эффективно извлекать права доступа из строк любого формата, а функция `preg_match_all` делает этот процесс максимально удобным.
