ホームページ  >  記事  >  バックエンド開発  >  PHPの実使用におけるmb_strwidthの問題点分析_PHPチュートリアル

PHPの実使用におけるmb_strwidthの問題点分析_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-15 13:30:391101ブラウズ

最近の PHP Web サイトプロジェクトのニュース部分には、タイトルの幅に応じて文字列をインターセプトし、最後に「...」を追加する関数が必要です。最初に思いつくのは、PHP の mb_string を使用することです。 mb_strimwidth.mb_strwidth という関数を使って実装したのですが、タイトルに "" 記号がある場合、PHP mb_strwidth はその記号を幅 1 として扱うことがわかりました。論理的に言えば、これは中国語の二重引用符ではないでしょうか。ワイドバイトでなければならず、長さは2幅でなければなりません。次に、「」のunicodeがそれぞれu201Cとu201Dであり、これらは中国語の文字の範囲内にないことをクエリします。次に、unicode.orgのコードテーブルをクエリして、u2000-を見つけます。 u206F はユニバーサルシンボルの範囲ですが、この範囲の文字はすべてワイドキャラクタ形式ですが、PHP の mb_ 関数では幅 1 であると認識されるため、自分自身に頼るしかありません。

実装されている関数は以下の通りです:

<ol class="dp-xml">
<li class="alt"><span><span>function truncString($str, $length)  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>$</span><span class="attribute">countLen</span><span>=</span><span class="attribute-value">0</span><span>;  </span>
</li>
<li>
<span>for($</span><span class="attribute">i</span><span>=</span><span class="attribute-value">0</span><span>;$i</span><span class="tag"><</span><span class="tag-name">mb_strlen</span><span>($str);$i++)  </span></li><li class="alt"><span>{  </span></li><li><span>$countLen+=amb_strwidth(mb_substr($str,$i,1));  </span></li><li class="alt"><span>if($countLen</span><span class="tag">></span><span>$length)  </span>
</li>
<li><span>return mb_substr($str,0,$i);  </span></li>
<li class="alt"><span>}  </span></li>
<li><span>return $str;  </span></li>
<li class="alt"><span>}  </span></li>
<li><span>function amb_strwidth($str_width)  </span></li>
<li class="alt"><span>{  </span></li>
<li>
<span>$</span><span class="attribute">count</span><span>=</span><span class="attribute-value">0</span><span>;  </span>
</li>
<li class="alt">
<span>for($</span><span class="attribute">i</span><span>=</span><span class="attribute-value">0</span><span>;$i</span><span class="tag"><</span><span class="tag-name">mb_strlen</span><span>($str_width);$i++)  </span>
</li>
<li><span>{  </span></li>
<li class="alt"><span>//if(mb_substr($str_width,$i,1)=="xE2x80x9C"||mb_substr($str_width,$i,1)=='xE2x80x9D')  </span></li>
<li><span>//如果遇到u2000-u206F内的字符则将计数器加2  </span></li>
<li class="alt"><span>if(preg_match("/[x{2000}-x{206F}]/u",mb_substr($str_width,$i,1)))  </span></li>
<li><span>$count+=2;  </span></li>
<li class="alt"><span>else  </span></li>
<li><span>$count+=mb_strwidth(mb_substr($str_width,$i,1));  </span></li>
<li class="alt"><span>}  </span></li>
<li><span>return $count;  </span></li>
<li class="alt"><span>} </span></li>
</ol>

上記は、PHP mb_strwidth を使用する際の問題に対する具体的な解決策です。


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/446292.html技術記事最近の PHP Web サイト プロジェクトのニュース部分には、タイトルの幅に応じて文字列をインターセプトし、最後に追加する関数が必要です...最初に思いつくのは、PHP の mb_string 関数を使用して実装することです...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。