PHP 에서 정보 포맷 작업 에 대한 자세 한 설명(Message Formatter 클래스)

머리말
국제 화 구성 요 소 를 학습 하 는 과정 에서 우 리 는 NumberFormatter 라 는 숫자의 포맷 작업 을 접 했 습 니 다.이 는 숫자 를 표준 형식,화폐,로 컬 언어 등 형식 으로 바 꿀 수 있 습 니 다.오늘 우 리 는 정보 포맷 에 사용 되 는 또 다른 종류의 Message Formatter 를 배 웠 습 니 다.주로 문자열 에 대한 작업 입 니 다.
Message Formatter 도 ICU 규범 을 따 르 고,밑바닥 은 C 의 ICU 조작 이기 때문에 C 관련 코드 의 사용 방식 과 크게 다 르 지 않다.
포맷

//    
$fmt = new MessageFormatter("zh_CN", "{0,number,integer}      {1,number,integer}    ,      {2,number}    ");
echo $fmt->format([4560, 123, 4560 / 123]), PHP_EOL;
// 4,560      123    ,      37.073    

$fmt = new MessageFormatter("de", "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum");
echo $fmt->format([4560, 123, 4560 / 123]), PHP_EOL;
// 4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum

echo MessageFormatter::formatMessage("zh_CN", "{0,number,integer}      {1,number,integer}    ,      {2,number}    ", [4560, 123, 4560 / 123]), PHP_EOL;
// 4,560      123    ,      37.073    

echo MessageFormatter::formatMessage("de", "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum", [4560, 123, 4560 / 123]), PHP_EOL;
// 4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum
보이 시 나 요?PDO 의 사전 컴 파일 작업 과 유사 한 자리 표시 자 입 니 다.format()방법 을 호출 한 후에 이 방법 안의 매개 변 수 를 대체 할 수 있 습 니 다.우 리 는 자 리 를 차지 하 는 데 사용 되 는 매개 변수 유형 과 위 치 를 지정 할 수 있 습 니 다.{매개 변수 아래 표 시 됩 니 다.유형,확장 형식}이것 이 바로 이 정보 데이터 포맷 의 자리 표시 자 규칙 정의 입 니 다.보기 에는 매우 간단 한 것 같 지만,사실 그것 은 더 많은 기능 이 있 으 니,우 리 는 뒤에서 볼 것 이다.그러나 주의해 야 할 것 은 숫자,날짜,텍스트 세 션 형식 만 지원 하고 글 의 마지막 참고 링크 에는 공식 문서 가 있 습 니 다.
Message Formatter::formatmessage()이 정적 방법 은 언어,사전 조작 문,교체 파 라 메 터 를 한꺼번에 지정 할 수 있 습 니 다.먼저 예화 한 다음 format()방법 을 호출 하지 않 아 도 됩 니 다.
역 포맷(규칙 에 따라 매개 변수 배열 가 져 오기)
포맷 할 수 있 습 니 다.물론 우 리 는 구문 규칙 에 따라 관련 문자열 을 역 포맷 하여 자리 표시 자 에 해당 하 는 매개 변수 목록 을 얻 을 수 있 습 니 다.

//                
$fmt = new MessageFormatter('zh_CN', "{0,number,integer}      {1,number,integer}    ,      {2,number}    ");
$res = $fmt->parse("4,560      123   ,      37.073    ");
var_export($res); // false
echo "ERROR: " . $fmt->getErrorMessage() . " (" . $fmt->getErrorCode() . ")
"; // ERROR: Parsing failed: U_MESSAGE_PARSE_ERROR (6) $fmt = new MessageFormatter('en_US', "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree"); $res = $fmt->parse("4,560 monkeys on 123 trees make 37.073 monkeys per tree"); var_export($res); // array ( // 0 => 4560, // 1 => 123, // 2 => 37.073, // ) $fmt = new MessageFormatter('de', "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum"); $res = $fmt->parse("4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum"); var_export($res); // array ( // 0 => 4560, // 1 => 123, // 2 => 37.073, // ) $fmt = MessageFormatter::parseMessage('de', "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum", "4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum"); var_export($fmt); // array ( // 0 => 4560, // 1 => 123, // 2 => 37.073, // )
실례 화 된 parse()방법 을 사용 하거나 정적 방법 인 Message Formatter::parseMessage()를 직접 사용 하면 이러한 조작 을 실현 할 수 있 습 니 다.주의해 야 할 것 은 zhCN,즉 중국어 언어 영역 설정 에 있어 서 이 조작 은 문제 가 될 수 있 습 니 다.getErrorMessage()와 getErrorCode()를 통 해 오류 정보 와 오류 코드 를 볼 수 있 습 니 다.중국어 로 직접 돌아 오 는 오류 정 보 는 분석 실패 입 니 다.
획득 규칙 설정
실례 화 된 대상 에서 우 리 는 규칙 문 구 를 동적 으로 수정 할 수 있다.

//       
$fmt = new MessageFormatter("zh_CN", "{0, number}     {1, number}    ");
echo "    : '" . $fmt->getPattern(), PHP_EOL; //     : '{0, number}     {1, number}    '
echo "     :" . $fmt->format(array(123, 456)), PHP_EOL; //      :123     456    

$fmt->setPattern("{0, number}      {1, number}   ");
echo "   : '" . $fmt->getPattern(), PHP_EOL; //    : '{0, number}      {1, number}   '
echo "        : " . $fmt->format(array(123, 456)), PHP_EOL; //         :123      456   
매우 간단 한 두 가지 방법 입 니 다.setPattern()은 현재 예화 에 대응 하 는 포맷 규칙 을 설정 하 는 데 사 용 됩 니 다.getPattern()은 현재 예화 대상 을 보 는 포맷 규칙 을 가 져 오 는 데 사 용 됩 니 다.새로운 규칙 을 설정 한 후에 format()또는 parse()를 진행 할 때 새로운 규칙 문구 에 따라 실 행 됩 니 다.
전체 예제 포맷
위 에서 말 했 듯 이 숫자 외 에 날짜 형식의 자리 표시 자 도 있 으 니 보 여 드 리 겠 습 니 다.

echo MessageFormatter::formatMessage('zh_CN', '    {3, date, full},      {3, time, ::Hms},        {0}  ,     {2,number,integer}    ,        {1,number,currency}     ', ['  ', 35.33, 25, new DateTime()]), PHP_EOL;
//     2020 11 16    ,      10:09:30,            ,     25    ,        ¥35.33     
이 구문 에서 우리 가 지정 한 매개 변수 순 서 는 구문 에 있 는 자리 표시 자 에 따라 나타 나 는 순서 가 아 닙 니 다.이렇게 하면 영향 을 주지 않 습 니 다.해당 하 는 위치 에 있 는 매개 변수 배열 아래 표 시 를 지정 하면 됩 니 다.예 를 들 어 첫 번 째{3,date,full}은 매개 변수 배열 의 네 번 째 요소(0 부터)를 지정 합 니 다.date 형식,time 형식 은 모두 지정 할 수 있 는 형식 입 니 다.물론 두 번 째 자리 표시 자 는 현재 시간 분 초 정보 만 표시 할 수 있 습 니 다.
문자열 정보 라면 간단 한{0}만 있 으 면 됩 니 다.문자열 은 많은 형식 설정 이 필요 없습니다.그리고 디지털 형식 은 화폐 등 유형 으로 직접 포맷 할 수 있 습 니 다.우리 가 전에 말 한 NumberFormatter 에서 지정 할 수 있 는 유형 과 같 습 니 다.
이 예 시 를 보면 이 Message Formatter 의 강 함 을 느 낄 수 있 지 않 습 니까?서 두 르 지 마라,그것 은 아직 더 큰 X 의 능력 이 있다.
매개 변수 내용 에 따라 복수 표시
복수 에 있어 서 사실은 중국어 문법 에 이런 문구 가 없다.예 를 들 어 고양이 한 마 리 는 a cat 이 고 고양이 두 마 리 는 two cats 이다.

echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}', [0]),PHP_EOL; // I Have no cat
echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}', [1]),PHP_EOL; // I Have a cat
echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}', [2]),PHP_EOL; // I Have 2 cats
매개 변수 유형의 plural 은 복수 라 는 뜻 이지 만 사실은 switch()문장의 용법 으로 볼 수 있 습 니 다.

echo MessageFormatter::formatMessage('zh_CN', ' {0, plural, =0{   } other{  #   }}', [0]),PHP_EOL; //     
echo MessageFormatter::formatMessage('zh_CN', ' {0, plural, =0{   } other{  #   }}', [1]),PHP_EOL; //    1   
echo MessageFormatter::formatMessage('zh_CN', ' {0, plural, =0{   } other{  #   }}', [2]),PHP_EOL; //    2   
\#번 호 는 대응 하 는 매개 변수 값 의 원래 내용 입 니 다.이 문법 은 이 Message Formatter 류 를 한 단계 더 올 려 놓 았 습 니 다.그리고 요!우 리 는 먼저 이 문 제 를 살 펴 보 자.

echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}}', [-1]),PHP_EOL; // I Have -1 cats
매개 변수 가 잘못 전 달 됐 습 니 다.-고양이 한 마리 가 틀 렸 죠?괜 찮 습 니 다.다른 처리 방법 으로 이 문 제 를 해결 할 수 있 습 니 다.
선택 조건 규칙

//      
echo MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [-1]),PHP_EOL; // I Have no cats
echo MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [0]),PHP_EOL; // I Have no cats
echo MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [1]),PHP_EOL; // I Have one cat
echo MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [2]),PHP_EOL; // I Have 2 cats
echo MessageFormatter::formatMessage('en_US', 'I Have {0, choice, 0 #no cats| 1 #one cat | 2 #{0, number} cats}', [10]),PHP_EOL; // I Have 10 cats
choice 라 는 단 어 를 보면 알 수 있 습 니 다.이것 은 선택 과 관련 된 문법 입 니 다.뒤의 매개 변 수 는 사실 하나의 구간 으로 각각<=0|1|>=2 의 범위 내 에서 어떤 내용 을 사용 하 는 지 를 대표 합 니 다.또 하나의 자리 차지 문자 규칙 에 서 는 자리 차지 기 호 를 계속 설정 할 수 있다.
총결산
또 한 차례 시 야 를 넓 혔 다.글 의 시작 부분 에 있 는 두 부분 은 사실 놀 라 운 부분 이 없다.왜냐하면 일반적인 문자열 의 교 체 는 모두 할 수 있 지만 뒤로 갈수 록 흥미진진 해진 다.물론 관련 규칙 문법 은 더 있 을 것 입 니 다.다만 이 자료 들 은 매우 적 습 니 다.PHP 공식 문서 든 ICU 의 공식 문서 든 많은 소 개 를 찾 지 못 했 습 니 다.그래서 우 리 는 학습 과 이해 의 태도 로 이런 일이 있다 는 것 을 먼저 알 고 앞으로 더 재 미 있 는 자 료 를 발견 한 후에 공 부 를 공유 하 는 것 이 좋 습 니 다.사용 한 친구 의 댓 글 도 함께 토론 하 기 를 바 랍 니 다!
PHP 의 정보 포맷 작업 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 PHP 의 정보 포맷 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
테스트 코드:
github.com/zhangyue050
참고 문서:
www.php.net/manual/zh/c
userguide.icu-project.org/formatparse

좋은 웹페이지 즐겨찾기