목차
PHP将部分内容替换成星号
백엔드 개발 PHP 튜토리얼 PHP将部分内容替换成星号_PHP教程

PHP将部分内容替换成星号_PHP教程

Jul 13, 2016 am 10:19 AM
콘텐츠 부분

PHP将部分内容替换成星号

在最近的项目中,会碰到到某人的手机号码隐藏中间几位,身份证号码只显示末尾4位的需求。当时一开始是网上搜索了一下,看到有人是用substr_replace这个函数来替换的,后面我也用了这个函数,但在用的时候不是很好用。
 
一、substr_replace
 
先来看看这个函数的语法:
 
substr_replace(string,replacement,start,length)
参数 描述
string 必需。规定要检查的字符串。
replacement 必需。规定要插入的字符串。
start
必需。规定在字符串的何处开始替换。
 
  正数 - 在第 start 个偏移量开始替换
 
  负数 - 在从字符串结尾的第 start 个偏移量开始替换
 
  0 - 在字符串中的第一个字符处开始替换
 
charlist
可选。规定要替换多少个字符。
 
  正数 - 被替换的字符串长度
 
  负数 - 从字符串末端开始的被替换字符数
 
  0 - 插入而非替换
 
1、当start与charlist都为正数的时候,非常好理解,也很符号人的逻辑,start是从0开始的,如下图,根据条件,绿色的将是要被替换的元素
 
 
 
2、当start为负数,charlist为正数的时候,也挺好理解的
 
 
 
3、当start为正数,charlist为负数的时候,这个我一开始理解错了
 
 
 
4、当start为负数,charlist为负数的时候,有一个地方需要注意的就是:如果 start 是负数且 length 小于等于 start,则 length 为 0。这个坑挺容易踩到的
 
 
 
5、charlist为0的时候,就变成插入了,而不是替换,额。。。
 
 
 
用下来,我是感觉不是很顺手,虽然说满足我现在的需求还是可以的,但是如果将来需要一些扩展的话,耍起来挺吃力的,所以就想到自己构造一个,将来用起来也方便。
 
 
 
二、自制的星号替换函数
 
replaceStar($str, $start, $length = 0)
参数 描述
str 必需。规定要检查的字符串。
start
必需。规定在字符串的何处开始替换。
 
  正数 - 在第 start 个偏移量开始替换
 
  负数 - 在从字符串结尾的第 start 个偏移量开始替换
 
  0 - 在字符串中的第一个字符处开始替换
 
length
可选。规定要替换多少个字符。
 
  正数 - 被替换的字符串长度,从左往右
 
  负数 - 被替换的字符串长度,从右往左
 
  0 - 如果start为正数,从start开始向左到最后
 
     - 如果start为负数,从start开始向右到最后
 
前面的两个参数与上面的一样,最后的参数与上面不同
 
1、当start与length都为正数,与substr_replace表现的一样
 
2、当start为负数,length为正数,与substr_replace表现的一样
 
 
substr_replace
replaceStar
start为正数,长度为负数
 
 
 
start为负数,长度为负数
 
 
 
 
 start为正数,长度为0 做插入操作
 start为负数,长度为0 做插入操作
三、源码分享
 
复制代码
public static function replaceStar($str, $start, $length = 0)
{
        $i = 0;
        $star = '';
        if($start >= 0) {
            if($length > 0) {
                $str_len = strlen($str);
                $count = $length;
                if($start >= $str_len) {//当开始的下标大于字符串长度的时候,就不做替换了
                    $count = 0;
                }
            }elseif($length
                $str_len = strlen($str);
                $count = abs($length);
                if($start >= $str_len) {//当开始的下标大于字符串长度的时候,由于是反向的,就从最后那个字符的下标开始
                    $start = $str_len - 1;
                }
                $offset = $start - $count + 1;//起点下标减去数量,计算偏移量
                $count = $offset >= 0 ? abs($length) : ($start + 1);//偏移量大于等于0说明没有超过最左边,小于0了说明超过了最左边,就用起点到最左边的长度
                $start = $offset >= 0 ? $offset : 0;//从最左边或左边的某个位置开始
            }else {
                $str_len = strlen($str);
                $count = $str_len - $start;//计算要替换的数量
            }
        }else {
            if($length > 0) {
                $offset = abs($start);
                $count = $offset >= $length ? $length : $offset;//大于等于长度的时候 没有超出最右边
            }elseif($length
                $str_len = strlen($str);
                $end = $str_len + $start;//计算偏移的结尾值
                $offset = abs($start + $length) - 1;//计算偏移量,由于都是负数就加起来
                $start = $str_len - $offset;//计算起点值
                $start = $start >= 0 ? $start : 0;
                $count = $end - $start + 1;
            }else {
                $str_len = strlen($str);
                $count = $str_len + $start + 1;//计算需要偏移的长度
                $start = 0;
            }
        }
 
        while ($i
            $star .= '*';
            $i++;
        }
 
        return substr_replace($str, $star, $start, $count);
}
复制代码
不擅长算法,这里就用很普通的逻辑来展示啦,没有用到啥数学公式。
 
1、if($start >= 0)这里做start大于等于0与小于0的分支
 
2、在start 的分之中,分别再做length 大于0,小于0和等于0的三个分支
 
3、最后计算出start、count和要替换的星号字符串,最后计算出的start与count都是正数,运用substr_replace做替换
 
 
 
四、单元测试
 
复制代码
public function testReplaceStar()
    {
        $actual = App_Util_String::replaceStar('123456789', 3, 2);
        $this->assertEquals($actual, '123**6789');
        
        $actual = App_Util_String::replaceStar('123456789', 9);
        $this->assertEquals($actual, '123456789');
        
        $actual = App_Util_String::replaceStar('123456789', 9, 2);
        $this->assertEquals($actual, '123456789');
        
        $actual = App_Util_String::replaceStar('123456789', 9, -9);
        $this->assertEquals($actual, '*********');
        
        $actual = App_Util_String::replaceStar('123456789', 9, -10);
        $this->assertEquals($actual, '*********');
        
        $actual = App_Util_String::replaceStar('123456789', 9, -11);
        $this->assertEquals($actual, '*********');
        
        $actual = App_Util_String::replaceStar('123456789', 3);
        $this->assertEquals($actual, '123******');
        
        $actual = App_Util_String::replaceStar('123456789', 0);
        $this->assertEquals($actual, '*********');
        
        $actual = App_Util_String::replaceStar('123456789', 0, 2);
        $this->assertEquals($actual, '**3456789');
 
        $actual = App_Util_String::replaceStar('123456789', 3, -3);
        $this->assertEquals($actual, '1***56789');
        
        $actual = App_Util_String::replaceStar('123456789', 1, -5);
        $this->assertEquals($actual, '**3456789');
        
        $actual = App_Util_String::replaceStar('123456789', 3, -3);
        $this->assertEquals($actual, '1***56789');
        
        $actual = App_Util_String::replaceStar('123456789', -3, 2);
        $this->assertEquals($actual, '123456**9');
        
        $actual = App_Util_String::replaceStar('123456789', -3, 5);
        $this->assertEquals($actual, '123456***');
        
        $actual = App_Util_String::replaceStar('123456789', -1, 2);
        $this->assertEquals($actual, '12345678*');
        
        $actual = App_Util_String::replaceStar('123456789', -1, -2);
        $this->assertEquals($actual, '1234567**');
        
        $actual = App_Util_String::replaceStar('123456789', -4, -7);
        $this->assertEquals($actual, '******789');
        
        $actual = App_Util_String::replaceStar('123456789', -1, -3);
        $this->assertEquals($actual, '123456***');
        
        $actual = App_Util_String::replaceStar('123456789', -1);
        $this->assertEquals($actual, '*********');
        
        $actual = App_Util_String::replaceStar('123456789', -2);
        $this->assertEquals($actual, '********9');
        
        $actual = App_Util_String::replaceStar('123456789', -9);
        $this->assertEquals($actual, '*23456789');
        
        $actual = App_Util_String::replaceStar('123456789', -10);
        $this->assertEquals($actual, '123456789');
        
        $actual = App_Util_String::replaceStar('123456789', -10, -2);
        $this->assertEquals($actual, '123456789');
    }

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/871181.htmlTechArticlePHP将部分内容替换成星号 在最近的项目中,会碰到到某人的手机号码隐藏中间几位,身份证号码只显示末尾4位的需求。当时一开始是网上...
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

iPhone에서 민감한 콘텐츠 경고를 활성화하고 해당 기능에 대해 알아보는 방법 iPhone에서 민감한 콘텐츠 경고를 활성화하고 해당 기능에 대해 알아보는 방법 Sep 22, 2023 pm 12:41 PM

특히 지난 10년 동안 모바일 장치는 친구 및 가족과 콘텐츠를 공유하는 주요 방법이 되었습니다. 접근하기 쉽고 사용하기 쉬운 인터페이스와 실시간으로 이미지 및 비디오를 캡처할 수 있는 기능은 콘텐츠 제작 및 공유를 위한 탁월한 선택입니다. 그러나 악의적인 사용자가 이러한 도구를 악용하여 보기에 적합하지 않고 사용자의 동의가 필요하지 않은 원치 않는 민감한 콘텐츠를 전달하기 쉽습니다. 이러한 일이 발생하지 않도록 iOS17에는 "민감한 콘텐츠 경고"라는 새로운 기능이 도입되었습니다. 이에 대해 살펴보고 iPhone에서 사용하는 방법을 살펴보겠습니다. 새로운 민감한 콘텐츠 경고는 무엇이며 어떻게 작동하나요? 위에서 언급한 것처럼 민감한 콘텐츠 경고는 사용자가 iPhone을 포함한 민감한 콘텐츠를 보지 못하도록 설계된 새로운 개인 정보 보호 및 보안 기능입니다.

360 탐색으로 열리도록 Microsoft Edge 브라우저를 변경하는 방법 - 360 탐색으로 열기를 변경하는 방법 360 탐색으로 열리도록 Microsoft Edge 브라우저를 변경하는 방법 - 360 탐색으로 열기를 변경하는 방법 Mar 04, 2024 pm 01:50 PM

Microsoft Edge 브라우저에서 360 탐색 페이지를 여는 페이지를 변경하는 방법은 실제로 매우 간단하므로 이제 Microsoft Edge에서 360 탐색 페이지를 여는 페이지를 변경하는 방법을 공유하겠습니다. 브라우저가 필요한 친구가 모두를 도울 수 있기를 바랍니다. Microsoft Edge 브라우저를 엽니다. 아래와 같은 페이지가 보입니다. 오른쪽 상단에 있는 점 3개 아이콘을 클릭하세요. '설정'을 클릭하세요. 설정 페이지의 왼쪽 열에서 "시작 시"를 클릭하세요. 오른쪽 열의 그림에 표시된 세 지점을 클릭한 다음("새 탭 열기"를 클릭하지 마세요), 편집을 클릭하고 URL을 "0"(또는 기타 의미 없는 숫자)으로 변경하세요. 그런 다음 "저장"을 클릭하세요. 다음으로 '를 선택하세요.

중국어로 치트 엔진을 설정하는 방법은 무엇입니까? 치트 엔진 설정 중국어 방식 중국어로 치트 엔진을 설정하는 방법은 무엇입니까? 치트 엔진 설정 중국어 방식 Mar 13, 2024 pm 04:49 PM

CheatEngine은 게임의 메모리를 편집하고 수정할 수 있는 게임 편집기입니다. 그러나 기본 언어는 중국어가 아니므로 많은 친구들에게 불편을 줍니다. 그렇다면 CheatEngine에서 중국어를 설정하는 방법은 무엇입니까? 오늘은 에디터가 CheatEngine에서 중국어를 설정하는 방법에 대해 자세히 소개하겠습니다. 도움이 되셨으면 좋겠습니다. 설정 방법 1: 1. 두 번 클릭하여 소프트웨어를 열고 왼쪽 상단에 있는 "편집"을 클릭합니다. 2. 그런 다음 아래 옵션 목록에서 "설정"을 클릭하세요. 3. 열리는 창의 왼쪽 열에서 "언어"를 클릭하세요.

Microsoft Edge에서 다운로드 버튼을 설정하는 위치 - Microsoft Edge에서 다운로드 버튼을 설정하는 방법 Microsoft Edge에서 다운로드 버튼을 설정하는 위치 - Microsoft Edge에서 다운로드 버튼을 설정하는 방법 Mar 06, 2024 am 11:49 AM

다운로드 버튼을 표시하도록 Microsoft Edge가 어디에 설정되어 있는지 알고 계시나요? 아래에서 편집기를 통해 다운로드 버튼을 표시하도록 설정하는 방법을 알려드리겠습니다. 1단계: 먼저 Microsoft Edge Browser를 열고 아래 그림과 같이 오른쪽 상단에 있는 [...] 로고를 클릭합니다. 2단계: 그런 다음 아래 그림과 같이 팝업 메뉴에서 [설정]을 클릭합니다. 3단계: 그런 다음 아래 그림과 같이 인터페이스 왼쪽에 있는 [모양]을 클릭합니다. 4단계: 마지막으로 [다운로드 버튼 표시] 오른쪽에 있는 버튼을 클릭하면 아래 그림과 같이 회색에서 파란색으로 변경됩니다. 위는 편집기가 Microsoft Edge에서 다운로드 버튼을 설정하는 방법을 제공하는 곳입니다.

HTML에서 세 부분을 어떻게 나란히 넣을 수 있나요? HTML에서 세 부분을 어떻게 나란히 넣을 수 있나요? Sep 04, 2023 pm 11:21 PM

태그는 HTML 문서의 구분을 정의합니다. 이 태그는 주로 쉬운 스타일링을 위해 유사한 콘텐츠를 그룹화하는 데 사용되며 HTML 요소의 컨테이너 역할도 합니다. CSS 속성을 사용하여 HTML에 세 개의 섹션 태그를 나란히 배치합니다. 이 목적을 달성하기 위해 CSS 속성 float가 사용됩니다. 구문 다음은 <div> 태그의 구문입니다. <divclass='division'>콘텐츠…</div>예1의 중국어 번역은 다음과 같습니다. 예 1 다음은 CSS 속성을 사용하여 HTML에 세 개의 나누기 클래스를 나란히 배치하는 예입니다. <!DOCTYPEhtml><html><

시공간을 여행하는 아인의 일상, 콘텐츠 영구 업데이트 시공간을 여행하는 아인의 일상, 콘텐츠 영구 업데이트 Mar 01, 2024 pm 08:37 PM

The Painted Traveler in Time and Space는 2월 29일 업데이트가 확정되었습니다. 플레이어는 Ain과 함께 야외 음악 축제에 가서 Ain과 함께 호감도 보너스를 얻을 수 있습니다. The Lingering Holiday Color Time 이벤트는 3월 4일에 시작됩니다. , 플레이어는 휴가 일정 레벨을 업그레이드하여 새로운 문자 메시지와 Lofter 콘텐츠를 잠금 해제할 수 있습니다. 시공을 여행하는 아인의 일상 : 상설 콘텐츠 업데이트 2월 29일 버전 이후 새로운 캠퍼스 스케줄 [야외음악제 참여하기]를 체험할 수 있으며, 아인과 함께 참여하면 호감도 보너스를 받을 수 있습니다. . 3월 4일 09:30부터 4월 15일 05:00까지 '그리움의 휴일·섹시한 시간' 이벤트 기간 동안 [휴가 일정] 레벨을 8레벨, 28레벨로 업그레이드하면 각각 새로운 문자 메시지와 로프터 콘텐츠가 잠금 해제된다. *새 SMS 및 Lofter가 추가되었습니다.

솔라나의 DEX 레이아웃 분석: 목성은 생태학의 미래인가? 솔라나의 DEX 레이아웃 분석: 목성은 생태학의 미래인가? Mar 26, 2024 pm 02:10 PM

출처: Shenchao TechFlow 솔라나 생태계에서 세간의 이목을 끄는 신흥 프로젝트인 Jupiter는 짧은 출시에도 불구하고 DeFi 분야에서 빠르게 등장했습니다. 그러나 이렇게 빠르게 발전하는 환경에서도 경제 모델의 개선과 토큰 가격의 안정성은 여전히 ​​중요합니다. 이러한 지원이 없으면 프로젝트는 결국 쇠퇴하거나 심지어 유지 불가능하게 되는 악순환에 쉽게 빠질 수 있습니다. 따라서 Jupiter는 프로젝트의 장기적인 개발과 성공을 보장하기 위해 지속적으로 경제적 설계를 최적화하고 토큰 가격 안정성을 보장해야 합니다. 솔라나 체인은 지난 주에 2차 시장에서 토큰 SOL이 빠르게 상승하고, Jupiter의 토큰 $JUP도 지난 2주 동안 상승하는 등 강력한 성과를 거두었습니다.

Apple의 새로운 iMessage 보안 프로토콜인 PQ3란 무엇입니까? Apple의 새로운 iMessage 보안 프로토콜인 PQ3란 무엇입니까? Feb 23, 2024 am 08:25 AM

PQ3 프로토콜이란 무엇입니까? 현재 통신 보안은 세 가지 보안 수준으로 측정됩니다. 수준 0: 이 수준에서는 메시지가 암호화되지 않은 상태로 유지됩니다. 수준 1: 여기 메시지는 종단 간 암호화되지만 추가 인증이나 양자 보안은 없습니다. 레벨 2: 여기에는 인증 및 양자 보안이 포함되지만 초기 키 설정으로 제한됩니다. 이는 대화 핵심 자료가 절대로 손상될 수 없는 경우에만 양자 보안이 제공될 수 있음을 의미합니다. 이미지 제공: Apple의 새로운 iMessage 보안 프로토콜 PQ3은 Apple이 말하는 "레벨 3 보안"을 달성한 것으로 인정받은 최초의 메시징 프로토콜입니다. 이 프로토콜은 양자 암호화 기술을 사용하여 키 생성 및 메시지 교환을 보호합니다. 키가 손상되더라도 레벨 3 PQC는

See all articles