ฉันจะรับอักขระ n ตัวแรกของสตริงใน PHP ได้อย่างไร วิธีที่เร็วที่สุดในการตัดสตริงเป็นจำนวนอักขระเฉพาะคืออะไรและต่อท้าย '... ' หากจำเป็น?
ฉันจะรับอักขระ n ตัวแรกของสตริงใน PHP ได้อย่างไร วิธีที่เร็วที่สุดในการตัดสตริงเป็นจำนวนอักขระเฉพาะคืออะไรและต่อท้าย '... ' หากจำเป็น?
คำตอบ:
//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));
อย่างไร
ฟังก์ชั่นนี้ถูกสร้างขึ้นใน PHP ตั้งแต่รุ่น 4.0.6 ดูเอกสาร
echo mb_strimwidth('Hello World', 0, 10, '...');
// outputs Hello W...
โปรดทราบว่าtrimmarker
(จุดไข่ปลาด้านบน) รวมอยู่ในความยาวที่ถูกตัดทอน
ส่วนขยาย Multibyte สามารถมีประโยชน์ได้หากคุณต้องการควบคุมชุดอักขระสตริง
$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) . '...';
}
บางครั้งคุณต้อง จำกัด สตริงให้เป็นคำที่สมบูรณ์ครั้งสุดท้ายนั่นคือคุณไม่ต้องการให้คำสุดท้ายแตกออกแทนที่จะหยุดด้วยคำที่สอง
เช่น: เราต้อง จำกัด "นี่คือสตริงของฉัน" ถึง 6 ตัวอักษร แต่แทนที่จะเป็น 'นี่ฉัน ... "เราต้องการให้เป็น' นี่ ... " คือเราจะข้ามตัวอักษรที่แตกหักในคำสุดท้าย
ว้าไม่ดีที่อธิบายนี่คือรหัส
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 มีตัวช่วยนี้เรียกว่า "text helper" นี่คือเอกสารบางส่วนจากคู่มือผู้ใช้ของ codeigniter ที่ใช้: http://codeigniter.com/user_guide/helpers/text_helper.html (เพียงอ่านส่วน word_limiter และ character_limiter) นี่คือสองฟังก์ชันที่เกี่ยวข้องกับคำถามของคุณ:
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;
}
}
}
}
if(strlen($text) > 10)
$text = substr($text,0,10) . "...";
ฟังก์ชั่นที่ฉันใช้:
function cutAfter($string, $len = 30, $append = '...') {
return (strlen($string) > $len) ?
substr($string, 0, $len - strlen($append)) . $append :
$string;
}
นี่คือสิ่งที่ฉันทำ
function cutat($num, $tt){
if (mb_strlen($tt)>$num){
$tt=mb_substr($tt,0,$num-2).'...';
}
return $tt;
}
โดยที่ $ num หมายถึงจำนวนตัวอักษรและ $ tt สตริงสำหรับการจัดการ
ฉันพัฒนาฟังก์ชั่นสำหรับการใช้งานนี้
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;
}
}
คุณเพียงแค่เรียกใช้ฟังก์ชันด้วย string และ limite
เช่น: 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
substr () จะดีที่สุดคุณจะต้องตรวจสอบความยาวของสตริงก่อน
$str = 'someLongString';
$max = 7;
if(strlen($str) > $max) {
$str = substr($str, 0, $max) . '...';
}
wordwrap จะไม่ตัดเส้นสตริงลงเพียงแยกมัน ...
$ width = 10;
$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);
หรือด้วย wordwrap
$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);
วิธีนี้จะไม่ตัดคำมันจะเพิ่มสามจุดหลังจากช่องว่างแรก ฉันแก้ไข @ Raccoon29 solution และฉันได้แทนที่ฟังก์ชั่นทั้งหมดด้วยฟังก์ชั่น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