PHPで文字列の最初のn文字を取得するにはどうすればよいですか?文字列を特定の文字数にトリミングし、必要に応じて「...」を追加する最も速い方法は何ですか?
PHPで文字列の最初のn文字を取得するにはどうすればよいですか?文字列を特定の文字数にトリミングし、必要に応じて「...」を追加する最も速い方法は何ですか?
回答:
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';
更新:
長さをチェックするための提案に基づいて(また、トリムされたストリングとトリムされていないストリングで同様の長さを確保する):
$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;
したがって、最大13文字の文字列を取得します。13(またはそれ以下)の通常の文字または10文字の後に「...」が続く
アップデート2:
または関数として:
function truncate($string, $length, $dots = "...") {
return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}
更新3:
この回答を書いてからしばらく経ちましたが、実際にはこのコードをもう使用していません。私はこの関数を使用して、単語の途中で文字列が壊れないようにしwordwrap
ます。
function truncate($string,$length=100,$append="…") {
$string = trim($string);
if(strlen($string) > $length) {
$string = wordwrap($string, $length);
$string = explode("\n", $string, 2);
$string = $string[0] . $append;
}
return $string;
}
$string = wordwrap($string, $length - sizeof($append));
か?
この機能は、バージョン4.0.6以降、PHPに組み込まれています。docsを参照してください。
echo mb_strimwidth('Hello World', 0, 10, '...');
// outputs Hello W...
trimmarker
(上記の省略記号)は切り捨てられた長さに含まれることに注意してください。
マルチバイト拡張は、文字列の文字セットを制御する必要がある場合に便利です。
$charset = 'UTF-8';
$length = 10;
$string = 'Hai to yoo! I like yoo soo!';
if(mb_strlen($string, $charset) > $length) {
$string = mb_substr($string, 0, $length - 3, $charset) . '...';
}
場合によっては、文字列を最後の完全な単語に制限する必要があります。つまり、最後の単語を分割したくない場合は、2番目の最後の単語で停止します。
例:「This is my String」を6文字に制限する必要がありますが、「This i ...」ではなく「This ...」にする必要があります。つまり、最後の単語の壊れた文字をスキップします。
ふw、説明が苦手です。こちらがコードです。
class Fun {
public function limit_text($text, $len) {
if (strlen($text) < $len) {
return $text;
}
$text_words = explode(' ', $text);
$out = null;
foreach ($text_words as $word) {
if ((strlen($word) > $len) && $out == null) {
return substr($word, 0, $len) . "...";
}
if ((strlen($out) + strlen($word)) > $len) {
return $out . "...";
}
$out.=" " . $word;
}
return $out;
}
}
単語を分割しないように注意してカットしたい場合は、次のようにすることができます
function ellipse($str,$n_chars,$crop_str=' [...]')
{
$buff=strip_tags($str);
if(strlen($buff) > $n_chars)
{
$cut_index=strpos($buff,' ',$n_chars);
$buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
}
return $buff;
}
$ strが$ n_charsより短い場合、そのままの状態で返します。
$ strが$ n_charsと等しい場合、それをそのまま返します。
$ strが$ n_charsより長い場合は、次にカットするスペースを探すか、または(最後までスペースがない場合)$ strが$ n_charsで失礼にカットされます。
注: HTMLの場合、このメソッドはすべてのタグを削除することに注意してください。
codeigniterフレームワークには、「テキストヘルパー」と呼ばれるこのためのヘルパーが含まれています。:ここでは適用されCodeIgniterのユーザーガイドからのいくつかのドキュメントですhttp://codeigniter.com/user_guide/helpers/text_helper.htmlを (ちょうどword_limiterとcharacter_limiterセクションを読んで)。あなたの質問に関連する2つの関数を以下に示します。
if ( ! function_exists('word_limiter'))
{
function word_limiter($str, $limit = 100, $end_char = '…')
{
if (trim($str) == '')
{
return $str;
}
preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);
if (strlen($str) == strlen($matches[0]))
{
$end_char = '';
}
return rtrim($matches[0]).$end_char;
}
}
そして
if ( ! function_exists('character_limiter'))
{
function character_limiter($str, $n = 500, $end_char = '…')
{
if (strlen($str) < $n)
{
return $str;
}
$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
if (strlen($str) <= $n)
{
return $str;
}
$out = "";
foreach (explode(' ', trim($str)) as $val)
{
$out .= $val.' ';
if (strlen($out) >= $n)
{
$out = trim($out);
return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
}
}
}
}
私が使用した機能:
function cutAfter($string, $len = 30, $append = '...') {
return (strlen($string) > $len) ?
substr($string, 0, $len - strlen($append)) . $append :
$string;
}
実際にご覧ください。
このための機能を開発しました
function str_short($string,$limit)
{
$len=strlen($string);
if($len>$limit)
{
$to_sub=$len-$limit;
$crop_temp=substr($string,0,-$to_sub);
return $crop_len=$crop_temp."...";
}
else
{
return $string;
}
}
あなたは文字列とリミテで関数を呼び出すだけです。
例:str_short("hahahahahah",5)
;
それはあなたの文字列を切り取り、最後に「...」を追加します
:)
関数内で(繰り返し使用するために)動的に制限された長さで作成するには、以下を使用します。
function string_length_cutoff($string, $limit, $subtext = '...')
{
return (strlen($string) > $limit) ? substr($string, 0, ($limit-strlen(subtext))).$subtext : $string;
}
// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26);
// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26, '..');
次のようにコードを抽象化するのが最適です(制限はオプションであり、デフォルトは10です)。
print limit($string);
function limit($var, $limit=10)
{
if ( strlen($var) > $limit )
{
return substr($string, 0, $limit) . '...';
}
else
{
return $var;
}
}
$limit + 3
あなたは、文字列をトリミングしないようにだけ制限を超えます。アプリケーション(HTML出力など)に応じて、…
代わりにエンティティを使用することを検討してください(通常はより楽しい)。前に提案したように、省略記号を追加する前に、(短縮された)文字列の末尾から文字以外を削除します。最後に、マルチバイト(UTF-8など)環境の場合は注意してください。strlen()およびsubstr()は使用できません。
これが最速の解決策かどうかはわかりませんが、最短の解決策のようです。
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
PSここにいくつかの例を参照してくださいhttps://stackoverflow.com/a/17852480/131337
このソリューションは単語をカットせず、最初のスペースの後に3つのドットを追加します。@ Raccoon29ソリューションを編集し、すべての関数をmb_関数に置き換えて、アラビア語などのすべての言語で機能するようにしました
function cut_string($str, $n_chars, $crop_str = '...') {
$buff = strip_tags($str);
if (mb_strlen($buff) > $n_chars) {
$cut_index = mb_strpos($buff, ' ', $n_chars);
$buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
}
return $buff;
}
$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
while(strlen($yourString) > 22) {
$pos = strrpos($yourString, " ");
if($pos !== false && $pos <= 22) {
$out = substr($yourString,0,$pos);
break;
} else {
$yourString = substr($yourString,0,$pos);
continue;
}
}
} else {
$out = $yourString;
}
echo "Output String: ".$out;
切り捨てられた文字列の長さに厳しい要件がない場合は、これを使用して切り捨て、最後の単語の切り取りを防ぐこともできます。
$text = "Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";
// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/', ' ', $text);
// truncates the text
$text_truncated = mb_substr($text_only_spaces, 0, mb_strpos($text_only_spaces, " ", 50));
// prevents last word truncation
$preview = trim(mb_substr($text_truncated, 0, mb_strrpos($text_truncated, " ")));
この場合、に$preview
なります"Knowledge is a natural right of every human being"
。
ライブコードの例:http : //sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713