MB_Strcut는 바이트로 문자열을 가로 채립니다. MB_SUBSTR 과 달리 MB_STRCUT는 바이트에 의해 가로 채고 종종 멀티 바이트 인코딩을 처리하는 데 사용됩니다.
예:
<?php
$str = "이것은 테스트 문자열입니다";
echo mb_strcut($str, 0, 6, "UTF-8"); // 산출:이것은 a입니다
?>
여기서 6은 바이트 수이며, 중국어는 일반적으로 UTF-8에서 3 바이트를 차지하므로 6 바이트를 가로 채는 것은 2 개의 중국어를 가로 채는 것과 같습니다.
HTML 코드가 있다고 가정합니다.
<?php
$html = "<p>이것은 a입니다<strong>시험</strong>끈。</p>";
mb_strcut 로 직접 가로 채면 태그 중간에 잘릴 수 있습니다.
$cut = mb_strcut($html, 0, 15, "UTF-8");
echo $cut;
이것은 <p>와 같은 불완전한 태그를 출력 할 수 있습니다. 이것은 <strong> 테스트이며 브라우저 렌더링 오류로 이어집니다.
먼저 HTML을 일반 텍스트로 구문 분석 하고 MB_Strcut를 사용하여 일반 텍스트 내용을 가로 채립니다.
차단 된 텍스트 길이에 따르면 원래 HTML에 다시지도를 작성하여 해당 부분 만 유지하십시오.
HTML 구조가 완료되도록 잘린 태그를 수정하십시오.
이 과정은 매우 복잡합니다. 일반적으로 우리는 기존 라이브러리를 사용하거나 단순히 정규식으로 처리합니다.
다음 샘플 코드는 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 으로 대체되었습니다.
MB_STRCUT 는 다중 바이트 인코딩 문자열의 바이트 인터셉트에 적합합니다.
HTML 코드를 직접 가로 채면 불완전한 태그가 쉽게 이어질 수 있습니다.
일반 텍스트를 먼저 처리 한 다음 HTML에 맵핑해야합니다.
구조물을 손상시키기 위해 미 세게 레이블을 닫습니다.
보다 복잡한 HTML 차단을 위해서는 정확도와 보안을 보장하기 위해 텍스트 차단 로직과 함께 특수 HTML 구문 분석 라이브러리 (예 : DomDocument )를 사용하는 것이 좋습니다.