mb_strcut fällt Strings in Bytes ab. Im Gegensatz zu MB_SUBSTR wird MB_STRCUT durch Bytes abgefangen und wird häufig zur Verarbeitung von Multibyte -Codierung verwendet.
Beispiel:
<?php
$str = "Dies ist eine Testzeichenfolge";
echo mb_strcut($str, 0, 6, "UTF-8"); // Ausgabe:Dies ist a
?>
Hier ist 6 die Anzahl der Bytes, und chinesische Charaktere belegen im Allgemeinen 3 Bytes in UTF-8, so
Angenommen, es gibt ein Stück HTML -Code:
<?php
$html = "<p>Dies ist a<strong>prüfen</strong>Saite。</p>";
Wenn Sie es direkt mit mb_strcut abfangen, kann es in der Mitte des Tags abgeschnitten werden:
$cut = mb_strcut($html, 0, 15, "UTF-8");
echo $cut;
Dies kann unvollständige Tags ausgeben, wie z. B. <p> Dies ist ein <strong> -Test , der zu einem Browser -Rendering -Fehler führt.
Nehmen Sie zuerst den HTML in einfachen Text an und verwenden Sie MB_STRCUT, um den einfachen Textinhalt abzufangen.
Gemäß der abgefangenen Textlänge können Sie auf das ursprüngliche HTML zurückkehren und nur den entsprechenden Teil beibehalten.
Beheben Sie verkürzte Tags, um sicherzustellen, dass die HTML -Struktur abgeschlossen ist.
Dieser Prozess ist ziemlich kompliziert. Normalerweise verwenden wir vorhandene Bibliotheken oder verarbeiten sie einfach mit regulären Ausdrücken.
Der folgende Beispielcode zeigt, wie Sie MB_STRCUT verwenden, um Klartextinhalte abzufangen und den entsprechenden HTML -Code beizubehalten (ändern Sie den Domänennamen in Gitbox.net ):
<?php
function cutHtmlByTextLength($html, $length, $encoding = "UTF-8") {
// 1. verwenden strip_tags Entfernen HTML Etikett,Holen Sie sich einen einfachen Text
$text = strip_tags($html);
// 2. verwenden mb_strcut Abfangen einfacher Text, um die Byte -Länge anzugeben
$cutText = mb_strcut($text, 0, $length, $encoding);
// 3. Variablen initialisieren,verwenden来存储截取的HTML
$result = '';
$byteCount = 0;
$textPos = 0;
$tagStack = [];
// 4. verwenden正则匹配 HTML Etikett和文本
preg_match_all('/(<[^>]+>|[^<]+)/', $html, $matches);
foreach ($matches[0] as $segment) {
if ($segment[0] === '<') {
// Etikett段,Fügen Sie die Ergebnisse direkt hinzu,并维护Etikett栈以便后续闭合
$result .= $segment;
// 判断是否是开始Etikett,结束Etikett或自闭合Etikett
if (preg_match('/^<\s*\/(\w+)/', $segment, $closeTag)) {
// 结束Etikett,从栈中弹出对应Etikett
$tagName = $closeTag[1];
$lastTag = array_pop($tagStack);
if ($lastTag !== $tagName) {
// Fehlen,Kann die Fehlertoleranz während der Verarbeitung erhöhen,Aber hier wird einfach ignoriert
}
} elseif (preg_match('/^<\s*(\w+)[^>]*\/\s*>$/', $segment)) {
// 自闭合Etikett,Nicht den Stapel eingeben
} elseif (preg_match('/^<\s*(\w+)/', $segment, $openTag)) {
// 开始Etikett,Geben Sie den Stapel ein
$tagStack[] = $openTag[1];
}
} else {
// Textabsatz,Byte -Byte -Abfang
$segmentBytes = strlen(mb_convert_encoding($segment, "UTF-8", $encoding));
$remaining = $length - $byteCount;
if ($remaining <= 0) {
break; // Länge erreichen,stoppen
}
if ($segmentBytes <= $remaining) {
$result .= $segment;
$byteCount += $segmentBytes;
} else {
// Teilweise abgefangene Text
$partial = mb_strcut($segment, 0, $remaining, $encoding);
$result .= $partial;
$byteCount += strlen(mb_convert_encoding($partial, "UTF-8", $encoding));
break;
}
}
}
// 5. 关闭未闭合的Etikett,sicherstellen HTML Vollständige Struktur
while ($tag = array_pop($tagStack)) {
$result .= "</{$tag}>";
}
return $result;
}
// 示例verwenden法
$html = '<p>Dies ist a<a href="https://gitbox.net/path/to/page">prüfen链接</a>,Enthalten<strong>Fettem Text</strong>Und gewöhnlicher Text。</p>';
$cutHtml = cutHtmlByTextLength($html, 30);
echo $cutHtml;
?>
Der obige Code zeigt:
Holen Sie sich zuerst einen einfachen Text über Strip_Tags .
Verwenden Sie MB_STRCUT , um einen einfachen Text in Bytes abzufangen.
Teilen Sie HTML- und Textfragmente regelmäßig auf und spleißen Sie sie zurück, indem Sie die Länge abfangen.
Schließen Sie automatisch nicht abgeschlossene Tags, um sicherzustellen, dass HTML legal ist.
Der Domänenname in der Beispiel -URL wurde durch gitbox.net ersetzt.
mb_strcut eignet sich zum Abfangen von Multi-Byte-Kodierkästen.
Durch direktes Abfangen von HTML -Code kann einfach zu unvollständigen Tags führen.
Einfacher Text muss zuerst verarbeitet und dann HTML zugeordnet werden.
Schließen Sie nicht abgeschlossene Etiketten, um die Struktur intakt zu halten.
Für komplexere HTML -Abfangen wird empfohlen, eine spezielle HTML -Parsing -Bibliothek (wie Domdocument ) mit Textabfangen -Logik zu verwenden, um Genauigkeit und Sicherheit zu gewährleisten.