検索
ホームページphp教程php手册PHP が HTML コード文字列をインターセプトする

需求:将一段文字截取一定的物理长度显示,注意,要截取的不是字符串的字节数,UFT-8 的编码中文字符是3个字节或者4个字节的,而显示的时候中文会占两个字符的长度,英文字符只占一个,全角的时候又有不同。

需求:将一段文字截取一定的物理长度显示,注意,要截取的不是字符串的字节数,UFT-8 的编码中文字符是3个字节或者4个字节的,而显示的时候中文会占两个字符的长度,英文字符只占一个,全角的时候又有不同。而且给的数据是HTML代码串,比如这样:

インターセプトするときは、div タグ内のコンテンツをインターセプトし、HTML タグを保持し、その中のテキストのみを処理する必要があります。たとえば、「李思」の「李」という単語をインターセプトするだけかもしれませんが、このようにフロントエンドに置くと、「李思」の前の a タグが閉じられないので、インターセプト後に、 HTML 構文が正しいことを確認する必要があります。

この問題は本当に解決するのが簡単ではなく、私は二日間憂鬱になりました。これは単なる文字列ですが、内容は HTML コードであり、DOM がないことに注意してください。フロントエンドで処理できれば、DOM を直接取得して内部のノードを処理し、最終的に innerHTML などを出力することができます。今はうまくいかないので、考えを変えなければなりません。私の同僚の考えは次のとおりです:

文字列の各文字をループします。タグを設定し、タグの先頭で UFT-8 エンコーディングで生成される中国語の長さは 3 または 4 になる可能性があります ため、厳密性は高くなります。コードに疑問があります。

私の個人的なアイデアは、Tidy を使用することです (具体的な使用方法については、PHP マニュアルを参照してください)。昨日Tidyについて勉強したところ、これがとても便利であることがわかりました。まず、この文字列を次のように Tidy オブジェクトに変換します。

$tidy = tiny_parse_string($str, array(), 'utf8'); // 最後の設定は、utf-8 ではなく、utf8 であることに注意してください。 、いいえ、真ん中のものです。

次に $tidy で本文を取得します ($tidy は変換後に

などのタグを自動的に追加するため):

$body = tiny_get_body($tidy);

現時点では、var_dump を使用して $body 構造をいくつか確認すると、各タグが対応する属性を持つ対応するオブジェクトに変換されることがわかります。たとえば、 sdf> など、そのようなステートメントに対応するいくつかの属性は次のとおりです。

name=>「a」

値 => “sdf
child=> 配列{[0]=>テキスト ノード オブジェクト、値は sdf}
属性=配列{”href”=>”#”}
…..その他の属性

ご覧のとおり、実際には、a タグに対応するノードの下にあるテキスト ノードの値を個別に処理できるため、HTML の整合性は損なわれません。本来は、aタグ内のテキストノードの値を変更すると、それに合わせてaタグの値も変更されると考えていましたが、その場合はaに対応するノードの値を直接返せば良いのではないかと考えていました。残念ながら、そのようなものになるとは予想していなかったので、その中のテキストを自分で記述する必要がありました。

Tidy オブジェクトの構造を理解した後は、すべてのノードを走査するだけで、div タグを見つけて内部のノードの処理を開始するだけで済みます。コードは次のとおりです:

if(mb_strwidth($subchild->value, ‘utf-8’) >= $len)

{
$subchild->value = mb_strimwidth($subchild->value, 0, $len, ‘…’, ‘utf-8’);
$trimed_str .= $subchild->value;
休憩;
}
それ以外
{
$trimed_str .= $subchild->value;
$len = $len - mb_strwidth($subchild->value, ‘utf-8’);
}

内部の $subchild は子ノードです。ここでは文字列の長さを取得するために

mb_strwidth が使用されていることに注意してください。 mb_strwidth を強くお勧めします。これは中国語を 2 文字の長さとして扱うので、ここでのニーズを正確に満たします。さらに、文字列をインターセプトするときに mb_strimwidth が使用されます。この関数は中国語も 2 文字の長さとして扱います。 mb_ で始まる関数は非常に使いやすいです。

具体的なコードは書きません。これは要件に基づいて書かれており、普遍的な形式に作られていないからです。いつかそれを普遍的なものにして公開する時間ができました。

さらに、FireFox が text-overflow 属性をサポートしていないのは残念です。サポートしていなければ、バックグラウンドで苦労して切り詰める必要はありません。もっと良い方法があれば、ぜひ提案してください!ご協力をよろしくお願いいたします。



声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター