Регулярные выражения в 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` делает этот процесс максимально удобным.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.