PHP 에서 정보 포맷 작업 에 대한 자세 한 설명(Message Formatter 클래스)
9390 단어 php포맷messageformatter
국제 화 구성 요 소 를 학습 하 는 과정 에서 우 리 는 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 …
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.