2009-07-11 21 views
7

Đây là những gì tôi đang cố gắng làm. Tôi có một khối văn bản và tôi muốn trích xuất 50 từ đầu tiên từ chuỗi mà không cắt bỏ các từ ở giữa. Đó là lý do tại sao tôi thích từ trái ngược với các ký tự, sau đó tôi chỉ có thể sử dụng một hàm left().Làm cách nào để chỉ nhận được một số từ được xác định từ một chuỗi trong php?

Tôi biết hàm str_word_count ($ var) sẽ trả về số từ trong một chuỗi, nhưng làm cách nào tôi chỉ trả về 50 từ đầu tiên?

Tôi đang hoàn toàn chìm đắm trên PHP và tôi chưa quen với nhiều chức năng chuỗi.

Cảm ơn trước, Jason

Trả lời

15

tôi sẽ khuyên bạn không nên sử dụng số lượng từ như một đường cơ sở. Bạn có thể dễ dàng kết thúc với số lượng nhiều hơn ít hơn hoặc nhiều hơn nhiều dữ liệu hơn dự định hiển thị.

Một cách tiếp cận mà tôi đã sử dụng trong quá khứ là yêu cầu độ dài mong muốn, nhưng đảm bảo rằng nó không cắt xén một từ. Dưới đây là một cái gì đó mà có thể làm việc cho bạn:

function function_that_shortens_text_but_doesnt_cutoff_words($text, $length) 
{ 
    if(strlen($text) > $length) { 
     $text = substr($text, 0, strpos($text, ' ', $length)); 
    } 

    return $text; 
} 

Điều đó nói rằng, nếu bạn vượt qua 1 như tham số thứ hai để str_word_count, nó sẽ trả về một mảng chứa tất cả các từ, và bạn có thể sử dụng thao tác mảng về điều đó. Ngoài ra, bạn có thể mặc dù, nó hơi hackey, phát nổ chuỗi trên không gian, v.v ... Nhưng điều đó giới thiệu rất nhiều chỗ cho lỗi, chẳng hạn như những thứ không phải là từ được tính là từ.

PS. Nếu bạn cần phiên bản an toàn Unicode của chức năng trên và có cài đặt các tiện ích mở rộng mbstring hoặc iconv, chỉ cần thay thế tất cả các hàm chuỗi bằng mb_ hoặc iconv_ tương đương tiền tố tương đương.

+0

Tất cả các câu trả lời đều có chất lượng, nhưng bạn đã giải thích lý do tại sao tôi nên đi theo ký tự thay vì từ. Cảm ơn! – JasonBartholme

+0

Nhân tiện, bạn không giải quyết tình huống không có khoảng trống trong ký tự '$ length' đầu tiên và bạn vẫn có thể kết thúc với * nhiều * ít dữ liệu hơn dự định hiển thị nếu không gian duy nhất nằm trong nhân vật thứ tư hay như vậy (xem câu trả lời của tôi cho giải pháp). – Zarel

+0

Thành thật mà nói, đối với những gì tôi đã sử dụng phương pháp này, đó sẽ không bao giờ là một vấn đề. Điểm tốt, mặc dù. – jason

8

str_word_count mất một tham số tùy chọn mà nói với nó những gì để quay trở lại.

Trả về một mảng các chuỗi có dòng chữ:

$words = str_word_count($var, 1); 

Sau đó, bạn có thể cắt mọi thứ lên với một cái gì đó như:

$len = min(50, count($words)); 
$first_fifty = array_slice($words, 0, $len); 
3

Bạn có chắc chắn bạn muốn có một số lượng nhất định các từ? Nếu bạn đang làm một cái gì đó giống như một "xem trước", nói chung tốt hơn để làm điều gì đó như "Lên đến 300 ký tự, cắt đứt tại một ranh giới từ", trong trường hợp này bạn có thể sử dụng một cái gì đó như:

if (strlen($str)>300) 
{ 
    $str = substr($str,0,300); 
    $pos = strrpos($str, ' '); 
    if ($pos !== false && $pos > 200) // If there is no space in the last 100 chars, just truncate 
    $str = substr($str,0,$pos); 
    // You may also want to add ellipses: 
    // $str .= '...'; 
} 
+0

Hi, bất cứ ai Modded xuống câu trả lời của tôi, bạn có thể giải thích những gì xảy ra với nó? Tôi thừa nhận rằng nó không gần như chi tiết như câu trả lời của jason, nhưng tôi không thấy bất cứ điều gì sai trái với nó ... – Zarel

+0

Bạn đã bỏ phiếu của tôi lên, nhưng bạn quên phải làm gì, nếu không có không gian? – Thinker

+0

Thực ra, tôi đã giải quyết tình huống đó. Tôi đã chỉnh sửa nó để bình luận dòng cụ thể mà tôi làm. – Zarel

2

Tôi đã tìm thấy cách dễ dàng hơn để làm điều này:

function get_len_of_word($str,$number) { $array_str = explode(" ", $str); if(isset($array_str[$number])) { return implode(" ",array_slice($array_str, 0, $number)); } return $str; }

1

Dưới đây là thêm một ví dụ,

function getWordsFromString($str,$word_count) 
{ 
    $new_str=$str; 
    $_strArr=explode(" ",$str); 
    $_tempArr=array(); 
    if(count($_strArr)>$word_count) 
    { 
     foreach ($_strArr as $key=> $value) { 
      $_tempArr[]=$value; 
      if($key==$word_count-1) 
      { 
       $new_str=implode(" ",$_tempArr).' ...'; 
      } 
     } 
    } 
    return $new_str; 
} 
0
function get_first_num_of_words($string, $num_of_words) 
    { 
     $string = preg_replace('/\s+/', ' ', trim($string)); 
     $words = explode(" ", $string); // an array 

     // if number of words you want to get is greater than number of words in the string 
     if ($num_of_words > count($words)) { 
      // then use number of words in the string 
      $num_of_words = count($words); 
     } 

     $new_string = ""; 
     for ($i = 0; $i < $num_of_words; $i++) { 
      $new_string .= $words[$i] . " "; 
     } 

     return trim($new_string); 
    } 

Sử dụng nó như thế này:

echo get_first_num_of_words("Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquid, illo?", 5); 

Đầu ra: Lorem ipsum dolor sit amet

Chức năng này cũng hoạt động rất tốt với các ký tự unicode như ký tự tiếng Ả Rập.

echo get_first_num_of_words("نموذج لنص عربي الغرض منه توضيح كيف يمكن استخلاص أول عدد معين من الكلمات الموجودة فى نص معين.", 100); 

Output: نموذج لنص عربي الغرض منه توضيح كيف يمكن استخلاص أول عدد معين من الكلمات الموجودة فى نص معين.

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