MB_STRCUTは、バイトで文字列をインターセプトします。 MB_SUBSTRとは異なり、 MB_STRCUTはバイトによって傍受され、マルチバイトエンコードの処理によく使用されます。
例:
<?php
$str = "これはテスト文字列です";
echo mb_strcut($str, 0, 6, "UTF-8"); // 出力:これはです
?>
ここで6はバイト数であり、漢字は一般にUTF-8で3バイトを占めているため、6バイトを傍受することは2つの漢字を傍受することに等しくなります。
HTMLコードの一部があるとします。
<?php
$html = "<p>これはです<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 href="https://gitbox.net/path/to/page">テスト链接</a>,含む<strong>大胆なテキスト</strong>と普通のテキスト。</p>';
$cutHtml = cutHtmlByTextLength($html, 30);
echo $cutHtml;
?>
上記のコードは次のことを示しています。
最初にsprip_tagsを介してプレーンテキストを取得します。
MB_STRCUTを使用して、プレーンテキストをバイトでインターセプトします。
定期的にHTMLとテキストフラグメントを分割し、長さを傍受することでそれらをスプライスします。
HTMLが合法であることを確認するために、除外されていないタグを自動的に閉じます。
サンプルURLのドメイン名はgitbox.netに置き換えられています。
MB_STRCUTは、マルチバイトエンコードされた文字列のバイトインターセプトに適しています。
HTMLコードを直接傍受すると、タグが不完全になる可能性があります。
プレーンテキストを最初に処理し、次にHTMLにマッピングする必要があります。
構造をそのままに保つために、閉鎖されていないラベルを閉じます。
より複雑なHTMLインターセプトのために、テキスト傍受ロジックを備えた特別なHTML解析ライブラリ( Domdocumentなど)を使用して、正確性とセキュリティを確保することをお勧めします。