簡體   English   中英

正則表達式,用於替換與字符串數組匹配的非破折號字符

[英]RegEx for replacing non-dash chars matching an array of strings

我有一些用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);

我當前解決方案的問題是,即使它們與任何私有常量都不匹配,它也會替換所有非破折號字符。

這是您可以做自己想做的一種方式。 這段代碼使用get_defined_constantsarray_filter查找所有PRIV*常量,使用array_mappreg_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上的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM