最近の 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 を使用する際の問題に対する具体的な解決策です。