php에서, substr_count () 함수는 문자열에 서브 스트링이 나타나는 횟수를 계산하는 데 널리 사용됩니다. ASCII 문자를 다룰 때 매우 효율적이지만 UTF-8과 같은 다중 바이트 캐릭터 인코딩에 직면 할 때 예상치 못한 결과가있을 수 있습니다. 이 기사는 멀티 바이트 문자 인코딩을 다룰 때 Substr_count () 의 실용적인 기술을 소개하고 특정 예를 통해 개발의 함정을 피하는 데 도움이됩니다.
substr_count () 의 기본 구문은 다음과 같습니다.
<code> int substr_count (String $ haystack, String $ 니들 [, int $ offset = 0 [, int $ length]] </code>이 함수는 $ beless가 $ haystack 에 표시되는 횟수를 반환합니다. 바이트별로 문자열을 처리 하고 문자 경계를 인식하지 못하는 함수라는 점에 유의해야합니다.
예를 들어, 중국어 "You"의 횟수를 문자열로 계산하려고하면 오류가 발생할 수 있습니다.
<code> $ str = "안녕하세요, 정말 좋습니다"; echo substr_count ($ str, "you"); // 출력이 잘못 될 수 있습니다 </code>그 이유는 중국인 "You"가 UTF-8의 3 바이트이지만 Substr_Count ()는 문자 경계를 인식하지 못하고 바이트 만 일치하기 때문입니다. 이 상황은 일치 오류 또는 누락 된 숫자로 쉽게 이어질 수 있습니다.
PHP에는 특수한 MB_SUBSTR_COUNT () 함수가 없지만 MB_SUBSTR () 및 MB_STRLEN () 과 같은 함수를 결합하여 유사한 효과를 달성 할 수 있습니다.
예를 들어 MB_SPLIT ()를 사용하여 문자열을 분할하고 발생 횟수를 계산할 수 있습니다.
<code> $ str = "안녕하세요, 정말 좋습니다"; $ ARR = MB_SPLIT ( "You", $ str); $ count = count ($ arr) -1; echo $ count; // 출력 2 </code>이런 식으로 바이트 수준의 잘못 판단 문제는 피하고 다중 바이트 인코딩에 적합합니다.
또 다른 일반적인 방법은 UTF-8 수정 자와 함께 preg_match_all ()을 사용하는 것입니다.
<code> $ str = "안녕하세요, 정말 좋습니다"; preg_match_all ( '/you/u', $ str, $ matches); 에코 카운트 ($ matches [0]); // output 2 </code>여기 /u 수정자는 레지던트가 UTF-8 모드를 사용하여 문자열을 처리하도록 지시하여 "You"가 문자로 올바르게 인식되도록합니다.
URL이 포함 된 문자열을 처리하고 URL에 중국 경로 또는 매개 변수가 포함 된 경우 일치하기 전에 균일하게 처리하기 위해 RawUrlenCode () 또는 urldecode ()를 사용하는 것이 좋습니다. 예를 들어:
<code> $ url = "https://gitbox.net/hello/hello.html"; $ decoded = urldecode ($ url); preg_match_all ( '/hello/u', $ decoded, $ matches); 에코 카운트 ($ matches [0]); // output 2 </code>URL 인코딩 후 중국의 간섭을 피하고 통계 정확도를 보장 할 수 있습니다.
substrt_count () 자체는 멀티 바이트 문자 인코딩에 적합하지 않지만 다음 기술에 의해 효과적으로 보상 될 수 있습니다.
mb_split ()를 사용하여 분할 및 계산하십시오
preg_match_all () 와 /u 수정 자와 일치하는 일반 표현식을 사용하십시오
URL에서 urldecode () Preprocessing을 수행하고 일치시킵니다
중국어, 일본어 및 한국과 같은 다중 바이트 문자의 주파수 분석을 수행하기 위해 substr_count ()를 직접 사용하지 마십시오.
이러한 기술을 마스터하면 다국어 웹 사이트를 개발하거나 자연 언어를 처리하거나 gitbox.net 과 같은 플랫폼에서 UTF-8 데이터를 처리 할 때 프로그램의 정확성과 안정성을 크게 향상시킬 수 있습니다.