現在の位置: ホーム> 最新記事一覧> MB_STRCUT関数を使用してHTMLテキストのコンテンツを傍受する方法

MB_STRCUT関数を使用してHTMLテキストのコンテンツを傍受する方法

gitbox 2025-05-29

1。MB_STRCUTの基本的な使用

MB_STRCUTは、バイトで文字列をインターセプトします。 MB_SUBSTRとは異なり、 MB_STRCUTはバイトによって傍受され、マルチバイトエンコードの処理によく使用されます。

例:

 <?php
$str = "これはテスト文字列です";
echo mb_strcut($str, 0, 6, "UTF-8");  // 出力:これはです
?>

ここで6はバイト数であり、漢字は一般にUTF-8で3バイトを占めているため、6バイトを傍受することは2つの漢字を傍受することに等しくなります。

2。HTMLコードを直接傍受するためにエラーが発生するのはなぜですか?

HTMLコードの一部があるとします。

 <?php
$html = "<p>これはです<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 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に置き換えられています。

5。概要

  • MB_STRCUTは、マルチバイトエンコードされた文字列のバイトインターセプトに適しています。

  • HTMLコードを直接傍受すると、タグが不完全になる可能性があります。

  • プレーンテキストを最初に処理し、次にHTMLにマッピングする必要があります。

  • 構造をそのままに保つために、閉鎖されていないラベルを閉じます。

より複雑なHTMLインターセプトのために、テキスト傍受ロジックを備えた特別なHTML解析ライブラリ( Domdocumentなど)を使用して、正確性とセキュリティを確保することをお勧めします。