ホームページ > バックエンド開発 > PHPチュートリアル > PHP HTML インターセプト コードの実装方法について詳しく説明します_PHP チュートリアル

PHP HTML インターセプト コードの実装方法について詳しく説明します_PHP チュートリアル

WBOY
リリース: 2016-07-15 13:31:24
オリジナル
1146 人が閲覧しました

今日紹介するのは の要件です。特定の物理的な長さのテキストをインターセプトし、それを表示します。インターセプトされるのは、UFT-8 でエンコードされた文字列のバイト数ではないことに注意してください。漢字は 3 文字または 4 バイト表示されますが、全角の場合は 1 文字のみ表示されます。

そして、与えられたデータは、次のような HTML コード文字列です:

<ol class="dp-xml">
<li class="alt"><span><span class="tag"><</span><span> </span><span class="tag-name">div</span><span> </span><span class="attribute">class</span><span>=&rdquo;aaa&rdquo;</span><span class="tag">></span></span></li>
<li class="alt"><span><span class="tag"><</span><span> </span><span class="tag-name">a</span><span> </span><span class="attribute">href</span><span>=&rdquo;/aaa.php?</span><span class="attribute">id</span><span>=</span><span class="attribute-value">1</span><span>&Prime;</span><span class="tag">></span></span></li>
<li class="alt"><span><span>张三</span></span></li>
<li class="alt"><span><span class="tag"><</span><span> /a</span><span class="tag">></span><span> </span></span></li>
<li class="alt"><span><span>评论了 </span></span></li>
<li class="alt"><span><span class="tag"><</span><span> </span><span class="tag-name">a</span><span> </span><span class="attribute">href</span><span>=&rdquo;/aaa.php?</span><span class="attribute">id</span><span>=</span><span class="attribute-value">444</span><span>&Prime;</span><span class="tag">></span></span></li>
<li class="alt"><span><span>李四</span></span></li>
<li class="alt"><span><span class="tag"><</span><span> /a</span><span class="tag">></span><span> </span></span></li>
<li class="alt"><span><span>分享的 </span></span></li>
<li class="alt"><span><span class="tag"><</span><span> </span><span class="tag-name">a</span><span> </span><span class="attribute">href</span><span>=&rdquo;bbb.html&rdquo;</span><span class="tag">></span></span></li>
<li class="alt"><span><span>一篇文章文章一长串的东西</span></span></li>
<li class="alt"><span><span class="tag"><</span><span> /a</span><span class="tag">></span></span></li>
<li class="alt"><span><span class="tag"><</span><span> /div</span><span class="tag">></span><span> </span></span></li>
</ol>
ログイン後にコピー

PHP HTML コードをインターセプトするときは、div タグ内のコンテンツをインターセプトし、HTML タグを保持し、その中のテキストのみを処理する必要があります。 。たとえば、「李思」の「李」という単語をインターセプトするだけかもしれませんが、このようにフロントエンドに置くと、「李思」の前の a タグが閉じられないので、インターセプト後に、 HTML 構文が正しいことを確認する必要があります。
この問題は本当に解決するのが簡単ではありません。私は二日間憂鬱になりました。これは単なる文字列ですが、内容は HTML コードであり、DOM がないことに注意してください。フロントエンドで処理できれば、DOM を直接取得して内部のノードを処理し、最終的に innerHTML などを出力することができます。今はうまくいかないので、考えを変えなければなりません。同僚のアイデアは次のとおりです:

文字列の各文字をトラバースします。タグを設定し、タグの先頭で < タグが見つかった場合は 1 に設定し、その後の文字はカウントされません。ラベル内の文字列を処理するときは、まず現在の文字エンコーディングが中国語であるかどうかを判断する必要があります。一般に、PHP で UTF-8 でエンコードされた中国語の文字の長さは 3 です。したがって、中国語の文字エンコーディングが見つかった場合は、次のようにする必要があります。カウントされていないものを 2 つスキップします... この時点で、私の頭は大きくなり始めています。個人的には、この方法は非常に不快だと思います。まず、この種の絶妙なロジックを制御するのは簡単ではありません。また、UFT-8 エンコーディングで生成される中国語の長さは 3 または 4 になる可能性があるため、コードの厳密さには疑問があります。 。

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

<ol class="dp-xml"><li class="alt"><span><span>$</span><span class="attribute">tidy</span><span> = </span><span class="attribute-value">tidy_parse_string<br /></span><span>($str, array(), &lsquo;utf8&prime;);   </span></span></li><li><span>// 最后一个是设置编码的,注意,<br />这里是utf8 ,不是utf-8,没有中间那个连线。 </span></li></ol>
ログイン後にコピー

次に、$tidy で本文を取得します (変換後、$tidy は などのタグを自動的に追加するため):
$body = tiny_get_body ($tidy);
この時点で、var_dump を使用して $body 構造体を確認すると、各タグが対応する属性を持つ対応するオブジェクトに変換されることがわかります。たとえば、sdf などのステートメントに対応する属性は次のとおりです。

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

実際に、a タグの対応するノードの下にあるテキスト ノードの値を個別に処理できるので、PHP HTML インターセプト コードが HTML の整合性を破壊しないことがわかります。当初は、aラベルのテキストノードの値を変更すると、それに合わせてaラベルの値も変更されると考えていましたが、その場合はaに対応するノードの値を直接返せばOKです。残念ながら、そのようなものになるとは予想していなかったので、その中のテキストを自分で記述する必要がありました。
Tidy オブジェクトの構造を理解した後は、すべてのノードを走査するだけで、div タグを見つけて内部のノードの処理を開始することができます。コードは次のとおりです。

<ol class="dp-xml">
<li class="alt"><span><span>if(mb_strwidth($subchild-</span><span class="tag">></span><span>value, <br>‘utf-8′) </span><span class="tag">></span><span>= $len)   </span></span></li>
<li><span>{   </span></li>
<li class="alt">
<span>$subchild-</span><span class="tag">></span><span class="attribute">value</span><span> = </span><span class="attribute-value">mb_strimwidth<br></span><span>($subchild-</span><span class="tag">></span><span>value, 0, $len, ‘…', ‘utf-8′);   </span>
</li>
<li>
<span>$trimed_str </span><span class="attribute">.</span><span>= $subchild-</span><span class="tag">></span><span>value;   </span>
</li>
<li class="alt"><span>break;   </span></li>
<li><span>}   </span></li>
<li class="alt"><span>else   </span></li>
<li><span>{   </span></li>
<li class="alt">
<span>$trimed_str </span><span class="attribute">.</span><span>= $subchild-</span><span class="tag">></span><span>value;   </span>
</li>
<li>
<span>$</span><span class="attribute">len</span><span> = $len - mb_strwidth($subchild-</span><span class="tag">><br></span><span>value, ‘utf-8′);   </span>
</li>
<li class="alt"><span>}  </span></li>
</ol>
ログイン後にコピー


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

具体的な PHP HTML インターセプト コードは書きません。これは要件に基づいて記述されており、汎用的な形式に作られていないためです。いつかそれを普遍的なものにして公開する時間ができました。
さらに、FireFox が text-overflow 属性をサポートしていないのは残念です。サポートしていなければ、バックグラウンドで懸命に処理してテキストを切り詰める必要はありません。もっと良い方法があれば、ぜひ提案してください!素晴らしい。


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/446217.html技術記事今日紹介する内容は、表示のためにテキストを特定の物理長までインターセプトするという要件に関するものです。インターセプトされるのは、UFT-8 のエンコードされた中国語文字ではないことに注意してください。は...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート