MB_strcut intercepte les chaînes en octets. Contrairement à MB_substr , MB_strcut est intercepté par des octets et est souvent utilisé pour traiter le codage multi -yte.
Exemple:
<?php
$str = "Ceci est une chaîne de test";
echo mb_strcut($str, 0, 6, "UTF-8"); // Sortir:C'est un
?>
Ici 6 est le nombre d'octets, et les caractères chinois occupent généralement 3 octets dans UTF-8, donc intercepter 6 octets est égal à l'interception de 2 caractères chinois.
Supposons qu'il y ait un morceau de code HTML:
<?php
$html = "<p>C'est un<strong>test</strong>Chaîne。</p>";
Si vous l'interceptez directement avec MB_strcut , il peut être tronqué au milieu de la balise:
$cut = mb_strcut($html, 0, 15, "UTF-8");
echo $cut;
Cela peut sortir des balises incomplètes, telles que <p> il s'agit d'un test <strong> , ce qui conduit à une erreur de rendu de navigateur.
Présente d'abord le HTML en texte brut et utilisez MB_strcut pour intercepter le contenu en texte brut.
Selon la longueur du texte interceptée, ramenez vers le HTML d'origine , en conservant uniquement la pièce correspondante.
Corrigez les balises tronquées pour s'assurer que la structure HTML est terminée.
Ce processus est assez compliqué. Habituellement, nous utilisons des bibliothèques existantes ou les traitons simplement avec des expressions régulières.
L'exemple de code suivant montre comment utiliser MB_strcut pour intercepter le contenu de texte brut et essayer de conserver le code HTML correspondant (modifiez le nom de domaine en gitbox.net ):
<?php
function cutHtmlByTextLength($html, $length, $encoding = "UTF-8") {
// 1. utiliser strip_tags Retirer HTML Étiquette,Obtenir un texte brut
$text = strip_tags($html);
// 2. utiliser mb_strcut Intercepter le texte brut pour spécifier la longueur des octets
$cutText = mb_strcut($text, 0, $length, $encoding);
// 3. Initialiser les variables,utiliser来存储截取的HTML
$result = '';
$byteCount = 0;
$textPos = 0;
$tagStack = [];
// 4. utiliser正则匹配 HTML Étiquette和文本
preg_match_all('/(<[^>]+>|[^<]+)/', $html, $matches);
foreach ($matches[0] as $segment) {
if ($segment[0] === '<') {
// Étiquette段,Ajouter des résultats directement,并维护Étiquette栈以便后续闭合
$result .= $segment;
// 判断是否是开始Étiquette,结束Étiquette或自闭合Étiquette
if (preg_match('/^<\s*\/(\w+)/', $segment, $closeTag)) {
// 结束Étiquette,从栈中弹出对应Étiquette
$tagName = $closeTag[1];
$lastTag = array_pop($tagStack);
if ($lastTag !== $tagName) {
// Manquant,Peut augmenter la tolérance aux défauts pendant le traitement,Mais voici simplement ignoré
}
} elseif (preg_match('/^<\s*(\w+)[^>]*\/\s*>$/', $segment)) {
// 自闭合Étiquette,Ne pas entrer la pile
} elseif (preg_match('/^<\s*(\w+)/', $segment, $openTag)) {
// 开始Étiquette,Entrez la pile
$tagStack[] = $openTag[1];
}
} else {
// Paragraphe texte,Octet octet interception
$segmentBytes = strlen(mb_convert_encoding($segment, "UTF-8", $encoding));
$remaining = $length - $byteCount;
if ($remaining <= 0) {
break; // En longueur,arrêt
}
if ($segmentBytes <= $remaining) {
$result .= $segment;
$byteCount += $segmentBytes;
} else {
// Texte partiellement intercepté
$partial = mb_strcut($segment, 0, $remaining, $encoding);
$result .= $partial;
$byteCount += strlen(mb_convert_encoding($partial, "UTF-8", $encoding));
break;
}
}
}
// 5. 关闭未闭合的Étiquette,assurer HTML Structure complète
while ($tag = array_pop($tagStack)) {
$result .= "</{$tag}>";
}
return $result;
}
// 示例utiliser法
$html = '<p>C'est un<a href="https://gitbox.net/path/to/page">test链接</a>,Inclure<strong>Texte audacieux</strong>Et texte ordinaire。</p>';
$cutHtml = cutHtmlByTextLength($html, 30);
echo $cutHtml;
?>
Le code ci-dessus démontre:
Obtenez d'abord du texte brut via Strip_Tags .
Utilisez MB_strcut pour intercepter le texte brut en octets.
Diviser régulièrement des fragments HTML et de texte et les épisser en interceptant la longueur.
Fermez automatiquement les balises non clôturées pour s'assurer que le HTML est légal.
Le nom de domaine de l'URL de l'échantillon a été remplacé par gitbox.net .
MB_strcut convient à l'interception d'octet des chaînes codées à plusieurs octets.
L'interception directement du code HTML peut facilement conduire à des balises incomplètes.
Le texte brut doit être traité d'abord, puis mappé à HTML.
Fermer les étiquettes non clôturées pour maintenir la structure intacte.
Pour une interception HTML plus complexe, il est recommandé d'utiliser une bibliothèque d'analyse HTML spéciale (telle que DomDocument ) avec une logique d'interception de texte pour garantir la précision et la sécurité.