در تاریخ دوشنبه ۲۱ سپتامبر ۲۰۲۶، ۰۴:۳۱ Ilia <[email protected]> نوشت:
> Why is this needed in php itself? Masking seems very use-case specific and > would be better done inside php library with extensible modules for > different types of data to mask. > > Ilia Alshanetsky > Technologist, CTO, Entrepreneur > E: [email protected] > T: @iliaa > B: http://ilia.ws > > On Fri, Sep 18, 2026, 2:29 p.m. سپهر محمودی <[email protected]> wrote: > >> Hi everyone, >> >> I'm officially starting my work on the ext/intl and standard string >> functions, and I'm very excited to share my first major proposal for PHP >> 8.7! >> >> I have successfully set up my local development environment and compiler >> on my machine, and everything is up and running smoothly. >> >> As part of this, I would like to propose a new native function called >> str_mask(). >> >> ### Proposal Overview >> The str_mask() function is designed to securely mask portions of a string >> using a specified mask character. This is extremely useful for handling >> sensitive user data like credit card numbers, phone numbers, and tokens. >> >> Signature: >> str_mask(string $string, string $mask_char = '*', int $offset = 0, ?int >> $length = null): string >> >> ### Examples >> 1. Masking a credit card (positive offset & length): >> $credit_card = '1234567890123456'; >> $masked_card = str_mask($credit_card, '*', 4, 8); >> // Output: 1234********3456 >> >> 2. Masking a phone number (negative offset to count from the end): >> $phone_number = '+989123456789'; >> $masked_phone = str_mask($phone_number, 'X', -4); >> // Output: +9891234XXXX >> >> You can find all the details, implementation plans, and RFC discussions >> here: >> https://wiki.php.net/rfc/str_mask >> >> Looking forward to hearing your feedback and thoughts! >> >> Best regards, >> Sepehr Mahmoudi >> > --------- Hi Ilia, Thanks for sharing your perspective. I completely agree that high-level, schema-aware masking (such as formatting credit cards, emails, or complex data structures) belongs in userland libraries and extensible packages. However, `str_mask()` is intentionally not designed to be a high-level formatter or business-logic helper. Instead, it is a low-level, positional string primitive—analogous to `str_pad()` or `substr_replace()`—that simply replaces a byte range with a repeating character without intermediate string allocations. Userland libraries currently implement this through `substr_replace($str, str_repeat(...))` or regex loops, incurring repeated string allocations and edge-case validation overhead. Having a single native primitive provides the fast, fail-safe foundation that those higher-level libraries can build upon. Best regards, Sepehr >>
