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
関数を使ってWordの途中で文字列を壊さないようにするこの関数を好みます:
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;
}
この機能はバージョン4.0.6からPHPに組み込まれました。 ドキュメントを見てください 。
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) . '...';
}
場合によっては、文字列を最後の完全なWordに制限する必要があります。つまり、最後のWordを壊したくない場合は、最後の2番目のWordで停止します。
例:「これは私の文字列」を6文字に制限する必要がありますが、「This i ...」ではなく「This ...」にします。つまり、最後のWordではこの壊れた文字をスキップします。
ふう、説明が下手だ、ここにコードがある。
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;
}
}
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 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より長い場合は、次にカットするスペースを探すか、(最後までスペースがない場合)$ n_charsで代わりに乱暴にカットします。
注: このメソッドはHTMLの場合にすべてのタグを削除することに注意してください。
if(strlen($text) > 10)
$text = substr($text,0,10) . "...";
そのようにコードを抽象化するのが最善です(制限はオプションで、デフォルトは10です)。
print limit($string);
function limit($var, $limit=10)
{
if ( strlen($var) > $limit )
{
return substr($string, 0, $limit) . '...';
}
else
{
return $var;
}
}
これが最速の解決策かどうかはわかりませんが、最短の解決策のように見えます。
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
P.Sここでいくつかの例を参照してください https://stackoverflow.com/a/17852480/131337
これが私がすることです
function cutat($num, $tt){
if (mb_strlen($tt)>$num){
$tt=mb_substr($tt,0,$num-2).'...';
}
return $tt;
}
$ numは文字数を表し、$ ttは操作を表す文字列を表します。
関数内で(繰り返し使用するために)動的に制限された長さで作成するには、次のようにします。
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, '..');
私はこの用途のための機能を開発しました
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;
}
}
あなたは文字列とlimiteで関数を呼ぶだけです
例:str_short("hahahahahah",5)
;
それはあなたの弦をカットして、最後に "..."を追加します
:)
私が使用した機能:
function cutAfter($string, $len = 30, $append = '...') {
return (strlen($string) > $len) ?
substr($string, 0, $len - strlen($append)) . $append :
$string;
}
実際に見る .
$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;
substr()が最善です、あなたはまた最初に文字列の長さをチェックしたいでしょう。
$str = 'someLongString';
$max = 7;
if(strlen($str) > $max) {
$str = substr($str, 0, $max) . '...';
}
wordwrapは文字列を切り捨てず、分割します。
この解決法は言葉を切らず、最初のスペースの後に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;
}
$ width = 10。
$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);
またはワードラップで
$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);