Làm thế nào tôi có thể nhận được n ký tự đầu tiên của một chuỗi trong PHP? Cách nhanh nhất để cắt một chuỗi thành một số ký tự cụ thể và nối thêm '...' nếu cần là gì?
Làm thế nào tôi có thể nhận được n ký tự đầu tiên của một chuỗi trong PHP? Cách nhanh nhất để cắt một chuỗi thành một số ký tự cụ thể và nối thêm '...' nếu cần là gì?
Câu trả lời:
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';
Cập nhật:
Dựa trên đề xuất để kiểm tra độ dài (và cũng đảm bảo độ dài tương tự trên các chuỗi được cắt và không được phân loại):
$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;
Vì vậy, bạn sẽ nhận được một chuỗi tối đa 13 ký tự; 13 (hoặc ít hơn) ký tự bình thường hoặc 10 ký tự theo sau là '...'
Cập nhật 2:
Hoặc như chức năng:
function truncate($string, $length, $dots = "...") {
return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}
Cập nhật 3:
Đã được một thời gian kể từ khi tôi viết câu trả lời này và tôi thực sự không sử dụng mã này nữa. Tôi thích chức năng này ngăn chặn việc ngắt chuỗi ở giữa một từ bằng cách sử dụng wordwrap
chức năng:
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));
?
Chức năng này đã được tích hợp vào PHP từ phiên bản 4.0.6. Xem tài liệu .
echo mb_strimwidth('Hello World', 0, 10, '...');
// outputs Hello W...
Lưu ý rằng trimmarker
(dấu chấm lửng ở trên) được bao gồm trong chiều dài cắt ngắn.
Phần mở rộng Multibyte có thể có ích nếu bạn cần kiểm soát bộ ký tự chuỗi.
$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) . '...';
}
đôi khi, bạn cần giới hạn chuỗi thành từ hoàn chỉnh cuối cùng, nghĩa là: bạn không muốn từ cuối cùng bị phá vỡ thay vào đó bạn dừng lại với từ cuối cùng thứ hai.
ví dụ: chúng ta cần giới hạn "Đây là Chuỗi của tôi" thành 6 ký tự nhưng thay vì 'Đây tôi ... "chúng tôi muốn nó là' Đây ..." tức là chúng tôi sẽ bỏ qua các chữ cái bị hỏng trong từ cuối cùng.
phew, xấu trong việc giải thích, đây là mã.
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;
}
}
Nếu bạn muốn cắt cẩn thận để không chia từ, bạn có thể làm như sau
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;
}
nếu $ str ngắn hơn $ n_chars, nó sẽ không bị ảnh hưởng.
Nếu $ str bằng với $ n_chars, thì nó cũng trả về.
nếu $ str dài hơn $ n_chars thì nó sẽ tìm khoảng trống tiếp theo để cắt hoặc (nếu không còn khoảng trống nào cho đến hết) $ str bị cắt một cách thô lỗ thay vào đó là $ n_chars.
LƯU Ý: lưu ý rằng phương pháp này sẽ xóa tất cả các thẻ trong trường hợp HTML.
Khung codeigniter chứa một trình trợ giúp cho việc này, được gọi là "trình trợ giúp văn bản". Dưới đây là một số tài liệu từ hướng dẫn sử dụng của codeigniter áp dụng: http://codeigniter.com/user_guide/helpers/text_helper.html (chỉ cần đọc phần word_limiter và character_limiter). Đây là hai chức năng liên quan đến câu hỏi của bạn:
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;
}
}
Và
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;
}
}
}
}
Hàm tôi đã sử dụng:
function cutAfter($string, $len = 30, $append = '...') {
return (strlen($string) > $len) ?
substr($string, 0, $len - strlen($append)) . $append :
$string;
}
Xem nó trong hành động .
Tôi đã phát triển một chức năng cho việc sử dụng này
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;
}
}
bạn chỉ cần gọi hàm với chuỗi và limite,
ví dụ : str_short("hahahahahah",5)
;
nó sẽ cắt chuỗi của bạn và thêm "..." vào cuối
:)
Để tạo trong một hàm (để sử dụng lặp lại) và độ dài giới hạn động, hãy sử dụng:
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, '..');
Tốt nhất là trừu tượng hóa mã của bạn như vậy (lưu ý giới hạn là tùy chọn và mặc định là 10):
print limit($string);
function limit($var, $limit=10)
{
if ( strlen($var) > $limit )
{
return substr($string, 0, $limit) . '...';
}
else
{
return $var;
}
}
$limit + 3
để bạn không cắt một chuỗi chỉ vượt quá giới hạn. Tùy thuộc vào ứng dụng của bạn (ví dụ: đầu ra HTML), hãy xem xét sử dụng một thực thể …
thay thế (theo kiểu chữ đẹp hơn). Như đã đề xuất trước đó, hãy cắt bỏ mọi chữ cái không nằm ở cuối chuỗi (rút ngắn) trước khi nối thêm dấu chấm lửng. Cuối cùng, coi chừng bạn đang ở trong môi trường đa bào (ví dụ UTF-8) - bạn không thể sử dụng strlen () và chất nền ().
Tôi không chắc đây có phải là giải pháp nhanh nhất không, nhưng có vẻ như đó là giải pháp ngắn nhất:
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
PS Xem một số ví dụ tại đây https://stackoverflow.com/a/17852480/131337
$ chiều rộng = 10;
$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);
hoặc với wordwrap
$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);
giải pháp này sẽ không cắt từ, nó sẽ thêm ba dấu chấm sau dấu cách đầu tiên. Tôi đã chỉnh sửa giải pháp @ Raccoon29 và tôi đã thay thế tất cả các hàm bằng các hàm mb_ để nó sẽ hoạt động cho tất cả các ngôn ngữ như tiếng Ả Rập
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;
Nếu không có yêu cầu cứng về độ dài của chuỗi bị cắt, người ta có thể sử dụng điều này để cắt bớt và cũng ngăn cắt từ cuối cùng:
$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, " ")));
Trong trường hợp này, $preview
sẽ được "Knowledge is a natural right of every human being"
.
Ví dụ về mã trực tiếp: http://sandbox.onlinephpfifts.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713