현재 위치: > 최신 기사 목록> HTML 텍스트의 내용을 가로 채기 위해 MB_Strcut 함수를 사용하는 방법

HTML 텍스트의 내용을 가로 채기 위해 MB_Strcut 함수를 사용하는 방법

gitbox 2025-05-29

1. MB_STRCUT의 기본 사용

MB_Strcut는 바이트로 문자열을 가로 채립니다. MB_SUBSTR 과 달리 MB_STRCUT는 바이트에 의해 가로 채고 종종 멀티 바이트 인코딩을 처리하는 데 사용됩니다.

예:

 <?php
$str = "이것은 테스트 문자열입니다";
echo mb_strcut($str, 0, 6, "UTF-8");  // 산출:이것은 a입니다
?>

여기서 6은 바이트 수이며, 중국어는 일반적으로 UTF-8에서 3 바이트를 차지하므로 6 바이트를 가로 채는 것은 2 개의 중국어를 가로 채는 것과 같습니다.

2. 왜 HTML 코드를 직접 가로 채려면 오류가 발생합니까?

HTML 코드가 있다고 가정합니다.

 <?php
$html = "<p>이것은 a입니다<strong>시험</strong>끈。</p>";

mb_strcut 로 직접 가로 채면 태그 중간에 잘릴 수 있습니다.

 $cut = mb_strcut($html, 0, 15, "UTF-8");
echo $cut;

이것은 <p>와 같은 불완전한 태그를 출력 할 수 있습니다. 이것은 <strong> 테스트이며 브라우저 렌더링 오류로 이어집니다.

3. 솔루션 아이디어

  1. 먼저 HTML을 일반 텍스트로 구문 분석 하고 MB_Strcut를 사용하여 일반 텍스트 내용을 가로 채립니다.

  2. 차단 된 텍스트 길이에 따르면 원래 HTML에 다시지도를 작성하여 해당 부분 만 유지하십시오.

  3. HTML 구조가 완료되도록 잘린 태그를 수정하십시오.

이 과정은 매우 복잡합니다. 일반적으로 우리는 기존 라이브러리를 사용하거나 단순히 정규식으로 처리합니다.

4. 샘플 코드 구현

다음 샘플 코드는 MB_Strcut를 사용하여 일반 텍스트 컨텐츠를 가로 채서 해당 HTML 코드를 유지하는 방법을 보여줍니다 (도메인 이름을 gitbox.net 으로 변경).

 <?php

function cutHtmlByTextLength($html, $length, $encoding = "UTF-8") {
    // 1. 사용 strip_tags 제거하다 HTML 상표,일반 텍스트를 받으십시오
    $text = strip_tags($html);

    // 2. 사용 mb_strcut 바이트 길이를 지정하려면 일반 텍스트를 가로 채립니다
    $cutText = mb_strcut($text, 0, $length, $encoding);

    // 3. 변수 초기화,사용来存储截取的HTML
    $result = '';
    $byteCount = 0;
    $textPos = 0;
    $tagStack = [];

    // 4. 사용正则匹配 HTML 상표和文本
    preg_match_all('/(<[^>]+>|[^<]+)/', $html, $matches);

    foreach ($matches[0] as $segment) {
        if ($segment[0] === '<') {
            // 상표段,결과를 직접 추가하십시오,并维护상표栈以便后续闭合
            $result .= $segment;

            // 判断是否是开始상표,结束상표或自闭合상표
            if (preg_match('/^<\s*\/(\w+)/', $segment, $closeTag)) {
                // 结束상표,从栈中弹出对应상표
                $tagName = $closeTag[1];
                $lastTag = array_pop($tagStack);
                if ($lastTag !== $tagName) {
                    // 없어진,처리 중에 결함 공차를 증가시킬 수 있습니다,그러나 여기에 단순히 무시됩니다
                }
            } elseif (preg_match('/^<\s*(\w+)[^>]*\/\s*>$/', $segment)) {
                // 自闭合상표,스택에 들어 가지 마십시오
            } elseif (preg_match('/^<\s*(\w+)/', $segment, $openTag)) {
                // 开始상표,스택을 입력하십시오
                $tagStack[] = $openTag[1];
            }
        } else {
            // 텍스트 단락,바이트 바이트 절편
            $segmentBytes = strlen(mb_convert_encoding($segment, "UTF-8", $encoding));
            $remaining = $length - $byteCount;

            if ($remaining <= 0) {
                break; // 길이에 도달합니다,멈추다
            }

            if ($segmentBytes <= $remaining) {
                $result .= $segment;
                $byteCount += $segmentBytes;
            } else {
                // 부분적으로 차단 된 텍스트
                $partial = mb_strcut($segment, 0, $remaining, $encoding);
                $result .= $partial;
                $byteCount += strlen(mb_convert_encoding($partial, "UTF-8", $encoding));
                break;
            }
        }
    }

    // 5. 关闭未闭合的상표,보장하다 HTML 완전한 구조
    while ($tag = array_pop($tagStack)) {
        $result .= "</{$tag}>";
    }

    return $result;
}

// 示例사용法
$html = '<p>이것은 a입니다<a href="https://gitbox.net/path/to/page">시험链接</a>,포함하다<strong>대담한 텍스트</strong>그리고 평범한 텍스트。</p>';
$cutHtml = cutHtmlByTextLength($html, 30);
echo $cutHtml;

?>

위의 코드는 다음을 보여줍니다.

  • 먼저 Strip_tags 를 통해 일반 텍스트를 받으십시오.

  • MB_STRCUT를 사용하여 일반 텍스트를 바이트로 가로 채립니다.

  • HTML과 텍스트 조각을 정기적으로 나누고 길이를 가로 채서 다시 연결합니다.

  • html이 합법적인지 확인하기 위해 구부리지 않은 태그를 자동으로 닫습니다.

샘플 URL의 도메인 이름은 gitbox.net 으로 대체되었습니다.

5. 요약

  • MB_STRCUT 는 다중 바이트 인코딩 문자열의 바이트 인터셉트에 적합합니다.

  • HTML 코드를 직접 가로 채면 불완전한 태그가 쉽게 이어질 수 있습니다.

  • 일반 텍스트를 먼저 처리 한 다음 HTML에 맵핑해야합니다.

  • 구조물을 손상시키기 위해 미 세게 레이블을 닫습니다.

보다 복잡한 HTML 차단을 위해서는 정확도와 보안을 보장하기 위해 텍스트 차단 로직과 함께 특수 HTML 구문 분석 라이브러리 (예 : DomDocument )를 사용하는 것이 좋습니다.