2009-07-09 29 views
12

Tôi có chuỗi sau trong một biến.Làm thế nào để nhận được x ký tự đầu tiên từ một chuỗi, mà không cắt bỏ từ cuối cùng?

 
Stack Overflow is as frictionless and painless to use as we could make it. 

Tôi muốn lấy 28 ký tự đầu tiên từ dòng trên, vì vậy thường nếu tôi sử dụng substr sau đó nó sẽ cho tôi Stack Overflow is as frictio sản lượng này nhưng tôi muốn đầu ra như:

 
Stack Overflow is as... 

Có sẵn -made chức năng trong PHP để làm như vậy, Hoặc xin vui lòng cung cấp cho tôi mã cho điều này trong PHP?

được sửa đổi:

Tôi muốn tổng 28 ký tự từ chuỗi mà không vi phạm một từ, nếu nó sẽ trả lại cho tôi vài ký tự ít hơn 28 mà không vi phạm một từ, đó là tốt.

+2

Vì vậy, bạn không thực sự muốn 28 ký tự đầu tiên nhưng thay vì vài từ đầu tiên lên đến độ dài 28. Có đúng không? –

+1

Có, tôi muốn tổng số 28 ký tự .. mà không vi phạm một từ, nếu nó sẽ trả lại cho tôi ít ký tự hơn 28 mà không vi phạm một từ, đó là tốt ... – Prashant

+1

Hơn chắc chắn rằng được xác định rõ ràng trong câu hỏi! –

Trả lời

49

Bạn có thể sử dụng wordwrap() chức năng, sau đó phát nổ trên xuống dòng và lấy phần đầu tiên:

$str = wordwrap($str, 28); 
$str = explode("\n", $str); 
$str = $str[0] . '...'; 
+0

Tôi đánh dấu phần này là câu trả lời, nhưng nó tạo ra vấn đề khi tôi đang sử dụng 'strip_tags' cho chuỗi. Tôi có một văn bản phong phú (html bao gồm thẻ) chuỗi và tôi muốn 'strip_tags' từ chuỗi đó và sau đó nhận được số lượng cố định của các ký tự. Nhưng sau đó trở lại trống của nó, bởi vì tôi nghĩ với 'strip_tags ($ str)' Nó biến mất tất cả '/ n' do đó phát nổ không thể phát nổ chuỗi đúng và nó trả về chuỗi trống. Bất kỳ giải pháp cho vấn đề này? – Prashant

+0

Bạn có thể sử dụng 'str_word_count' (http://uk3.php.net/manual/en/function.str-word-count.php) để kiểm tra nội dung sau đó lặp lại thành phần' $ str [] 'tiếp theo nếu nó trả về '0'? –

+0

Tôi đánh dấu phần này là câu trả lời có vẻ là tốt nhất và vấn đề của tôi được giải quyết 100% Cảm ơn @Greg – humphrey

-1

tại sao không thử phát nổ và nhận được 4 thành phần đầu tiên của mảng?

0

thử:

$string='Stack Overflow is as frictionless and painless to use as we could make it.'; 
$n=28; 
$break=strpos(wordwrap($string, $n,'<<||>>'),'<<||>>'); 
print substr($string,0,($break==0?strlen($string):$break)).(strlen($string)>$n?'...':''); 

$string='Stack Overflow'; 
$n=28; 
$break=strpos(wordwrap($string, $n,'<<||>>'),'<<||>>'); 
print substr($string,0,($break==0?strlen($string):$break)).(strlen($string)>$n?'...':''); 
9

Từ AlfaSky:

function addEllipsis($string, $length, $end='…') 
{ 
    if (strlen($string) > $length) 
    { 
     $length -= strlen($end); 
     $string = substr($string, 0, $length); 
     $string .= $end; 
    } 

    return $string; 
} 

Một thay thế, thực hiện featureful hơn từ Elliott Brueggeman's blog:

/** 
* trims text to a space then adds ellipses if desired 
* @param string $input text to trim 
* @param int $length in characters to trim to 
* @param bool $ellipses if ellipses (...) are to be added 
* @param bool $strip_html if html tags are to be stripped 
* @return string 
*/ 
function trim_text($input, $length, $ellipses = true, $strip_html = true) { 
    //strip tags, if desired 
    if ($strip_html) { 
     $input = strip_tags($input); 
    } 

    //no need to trim, already shorter than trim length 
    if (strlen($input) <= $length) { 
     return $input; 
    } 

    //find last space within length 
    $last_space = strrpos(substr($input, 0, $length), ' '); 
    $trimmed_text = substr($input, 0, $last_space); 

    //add ellipses (...) 
    if ($ellipses) { 
     $trimmed_text .= '...'; 
    } 

    return $trimmed_text; 
} 

(Google tìm kiếm: "php elip cắt")

3

Dưới đây là một cách để bạn có thể làm điều đó:

$str = "Stack Overflow is as frictionless and painless to use as we could make it."; 

$strMax = 28; 
$strTrim = ((strlen($str) < $strMax-3) ? $str : substr($str, 0, $strMax-3)."..."); 

//or this way to trim to full words 
$strFull = ((strlen($str) < $strMax-3) ? $str : strrpos(substr($str, 0, $strMax-3),' ')."..."); 
-1
substr("some string", 0, x); 

Từ PHP Manual

+0

Ya nhưng sử dụng điều này đôi khi ngắt lời ... và tôi đã đề cập trong câu hỏi của tôi rằng chất nền không làm những gì tôi muốn , vui lòng đọc lại câu hỏi :) – Prashant

+0

Cuộn xuống phiên bản nâng cao. http://us.php.net/manual/en/function.substr.php#73233 – mcandre

0

Tôi sẽ sử dụng số string tokenizer để chia chuỗi thành các từ giống như sau:

$string = "Stack Overflow is as frictionless and painless to use as we could make it."; 
$tokenized_string = strtok($string, " "); 

Sau đó, bạn có thể rút ra các từ riêng lẻ theo bất kỳ cách nào bạn muốn.


Chỉnh sửa: Greg có cách tốt hơn và thanh lịch hơn để thực hiện những gì bạn muốn. Tôi sẽ đi với giải pháp wordwrap() của mình.

2

Đây là giải pháp đơn giản nhất tôi biết ...

substr($string,0,strrpos(substr($string,0,28),' ')).'...'; 
0

bạn có thể sử dụng wordwrap.

string wordwrap (string $str [, int $width= 75 [, string $break= "\n" [, bool $cut= false ]]]) 

-

function firstNChars($str, $n) { 
    return array_shift(explode("\n", wordwrap($str, $n))); 
} 

echo firstNChars("bla blah long string", 25) . "..."; 

từ chối trách nhiệm: không kiểm tra nó.

ngoài ra, nếu chuỗi của bạn chứa \n s, nó có thể bị hỏng trước đó.

0
function truncate($string, $limit, $break=" ", $pad="...") { 

// return with no change if string is shorter than $limit 
if(strlen($string) <= $limit){ 
    return $string; 
} 

$string = substr($string, 0, $limit); 
if(false !== ($breakpoint = strrpos($string, $break))){ 
    $string = substr($string, 0, $breakpoint); 
} 
return $string . $pad; 
} 
2

Đây là cách đơn giản nhất:

<?php 
$title = "this is the title of my website!"; 
$number_of_characters = 15; 
echo substr($title, 0, strrpos(substr($title, 0, $number_of_characters), " ")); 
?> 
0

vấn đề có thể phát sinh nếu chuỗi của bạn có thẻ html, & nbsp và nhiều không gian. Dưới đây là những gì tôi sử dụng mà sẽ chăm sóc của tất cả mọi thứ:

function LimitText($string,$limit,$remove_html=0){ 
    if ($remove_html==1){$string=strip_tags($string);} 
    $newstring = preg_replace("/(?:\s|&nbsp;)+/"," ",$string, -1); // replace &nbsp with space 
    $newstring = preg_replace(array('/\s{2,}/','/[\t\n]/'),' ',$newstring); // replace duplicate spaces 
    if (strlen($newstring)<=$limit) { return $newstring; } // ensure length is more than $limit 
    $newstring = substr($newstring,0,strrpos(substr($newstring,0,$limit),' ')); 
    return $newstring; 
} 

sử dụng:

$string = 'My wife is jealous of stackoverflow'; 
echo LimitText($string,20); 
// My wife is jealous 

sử dụng với html:

$string = '<div><p>My wife is jealous of stackoverflow</p></div>'; 
echo LimitText($string,20,1); 
// My wife is jealous 
0

này làm việc cho tôi Perfect

function WordLimt($Keyword,$WordLimit){ 

    if (strlen($Keyword)<=$WordLimit) { return $Keyword; } 
    $Keyword= substr($Keyword,0,strrpos(substr($Keyword,0,$WordLimit),' ')); 
    return $Keyword; 
} 

echo WordLimt($MyWords,28); 

// OutPut : Stack Overflow is as 

nó sẽ điều chỉnh và phá vỡ không gian cuối cùng mà không cần cắt từ ...

Các vấn đề liên quan