RegEx для замены не-тире символов, соответствующих массиву строк - PullRequest
1 голос
/ 11 мая 2019

У меня есть несколько констант, определенных в PHP, и я считаю их приватными и не должны отображаться в браузере.

const PRIV_API_KEY = '1234-5678-8426';
const PRIV_ACCESS_TOKEN = 'fnse0segh-23hfoeghl-fseuhosz';
...

Если у меня есть такая строка

$message = 'Lorem ipsum dolor sit ammet 1234-5678-8426 bibendum id et dolor.';

Где 1234-5678-8426 может быть любой из констант, которые я упомянул выше. Я хотел бы заменить все символы, кроме тире (-), если они соответствуют какой-либо из частных констант.

То, чего я хочу достичь, это что-то вроде:

Lorem ipsum dolor sit ammet ****-****-**** bibendum id et dolor.

До сих пор я дошел до того, что придумал регулярное выражение для замены не-тире символов.

$message = preg_replace('/[^-]/', '*', $message);

Проблема с моим текущим решением состоит в том, что оно заменяет ВСЕ не-тире, даже если они не соответствуют ни одной из частных констант.

1 Ответ

2 голосов
/ 11 мая 2019

Вот один из способов сделать то, что вы хотите.Этот код находит все ваши PRIV* константы, используя get_defined_constants и array_filter, преобразует их в регулярные выражения, используя array_map и preg_quote, а затем использует preg_replace_callback для замены всех вхождений констант в строке на *, отличные от - символов:

const PRIV_API_KEY = '1234-5678-8426';
const PRIV_ACCESS_TOKEN = 'fnse0segh-23hfoeghl-fseuhosz';
const NONPRIV_CONST = 42;

$priv_constants = array_filter(get_defined_constants(true)['user'], function ($k) { return substr($k, 0, 4) == 'PRIV'; }, ARRAY_FILTER_USE_KEY);
$regexes = array_map(function ($v) { return '/' . preg_quote($v) . '/' ; }, $priv_constants);

$message = 'Lorem ipsum dolor sit ammet 1234-5678-8426 bibendum id et dolor. Lorem ipsum dolor fnse0segh-23hfoeghl-fseuhosz sit ammet bibendum id et dolor.';

$message = preg_replace_callback($regexes, function ($m) { return preg_replace('/[^-]/', '*', $m[0]); }, $message);
echo $message;

Вывод:

Lorem ipsum dolor sit ammet ****-****-**** bibendum id et dolor. Lorem ipsum dolor *********-*********-******** sit ammet bibendum id et dolor.

Демонстрация на 3v4l.org

...