Hướng dẫn dùng substring perl trong PHP

  1. Trang Chủ
  2. PHP

Ví dụ của bài viết này cho biết phương pháp của php có được hệ thống phụ theo vị trí và độ dài được chỉ định. Chia sẻ nó cho tất cả mọi người để bạn tham khảo. Phân tích cụ thể như sau:

php substr Hàm rất mạnh, bạn có thể tiếp tục đi từ phía sau của hệ thống phụ


Kết quả đầu ra:

Position counted from left: begin
Position counted form right: gin

PHP Nhận Hậu Tố Của Tệp?

Phương pháp đầu tiên là sử dụng mảng. Trước tiên, hãy cắt tên tệp vào một mảng số và sau đó tìm cách lấy phần tử cuố

Kết quả

Class:TINK32
Id: 1061016

Tổng kết

Qua 2 ví dụ trên bạn đã được hướng dẫn cách để sử dụng hàm substr[] tách một phần của chuỗi trong php. Nội dung này cần tư duy khác nhiều nên bạn cần ghi chép và thực hành lại để nắm chắc bài học.

answer

229

Bằng cách sử dụng chức năng wordwrap . Nó chia các văn bản thành nhiều dòng sao cho chiều rộng tối đa là chiều rộng bạn đã chỉ định, phá vỡ ranh giới từ. Sau khi tách, bạn chỉ cần lấy dòng đầu tiên:

substr[$string, 0, strpos[wordwrap[$string, $your_desired_width], "\n"]];

Một điều mà oneliner này không xử lý được là trường hợp văn bản chính nó ngắn hơn chiều rộng mong muốn. Để xử lý trường hợp cạnh này, bạn nên làm điều gì đó như:

if [strlen[$string] > $your_desired_width] 
{
    $string = wordwrap[$string, $your_desired_width];
    $string = substr[$string, 0, strpos[$string, "\n"]];
}

Giải pháp trên có vấn đề là cắt văn bản sớm nếu nó chứa một dòng mới trước điểm cắt thực tế. Đây là một phiên bản giải quyết vấn đề này:

function tokenTruncate[$string, $your_desired_width] {
  $parts = preg_split['/[[\s\n\r]+]/', $string, null, PREG_SPLIT_DELIM_CAPTURE];
  $parts_count = count[$parts];

  $length = 0;
  $last_part = 0;
  for [; $last_part < $parts_count; ++$last_part] {
    $length += strlen[$parts[$last_part]];
    if [$length > $your_desired_width] { break; }
  }

  return implode[array_slice[$parts, 0, $last_part]];
}

Ngoài ra, đây là lớp thử nghiệm PHPUnit được sử dụng để kiểm tra việc triển khai:

class TokenTruncateTest extends PHPUnit_Framework_TestCase {
  public function testBasic[] {
    $this->assertEquals["1 3 5 7 9 ",
      tokenTruncate["1 3 5 7 9 11 14", 10]];
  }

  public function testEmptyString[] {
    $this->assertEquals["",
      tokenTruncate["", 10]];
  }

  public function testShortString[] {
    $this->assertEquals["1 3",
      tokenTruncate["1 3", 10]];
  }

  public function testStringTooLong[] {
    $this->assertEquals["",
      tokenTruncate["toooooooooooolooooong", 10]];
  }

  public function testContainingNewline[] {
    $this->assertEquals["1 3\n5 7 9 ",
      tokenTruncate["1 3\n5 7 9 11 14", 10]];
  }
}

BIÊN TẬP :

Các ký tự UTF8 đặc biệt như 'à' không được xử lý. Thêm 'u' vào cuối REGEX để xử lý nó:

$parts = preg_split['/[[\s\n\r]+]/u', $string, null, PREG_SPLIT_DELIM_CAPTURE];

229 hữu ích 5 bình luận chia sẻ

answer

140

Điều này sẽ trả về 200 ký tự đầu tiên của từ:

preg_replace['/\s+?[\S+]?$/', '', substr[$string, 0, 201]];

140 hữu ích 5 bình luận chia sẻ

answer

47

$WidgetText = substr[$string, 0, strrpos[substr[$string, 0, 200], ' ']];

Và bạn đã có nó - một phương pháp đáng tin cậy để cắt ngắn bất kỳ chuỗi nào thành toàn bộ từ gần nhất, trong khi vẫn duy trì độ dài chuỗi tối đa.

Tôi đã thử các ví dụ khác ở trên và chúng không tạo ra kết quả mong muốn.

47 hữu ích 4 bình luận chia sẻ

answer

37

Giải pháp sau được sinh ra khi tôi nhận thấy tham số $ break của hàm wordwrap :

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

Đây là giải pháp :

/**
 * Truncates the given string at the specified length.
 *
 * @param string $str The input string.
 * @param int $width The number of chars at which the string will be truncated.
 * @return string
 */
function truncate[$str, $width] {
    return strtok[wordwrap[$str, $width, "...\n"], "\n"];
}

Ví dụ 1.

print truncate["This is very long string with many chars.", 25];

Ví dụ trên sẽ xuất ra:

This is very long string...

Ví dụ # 2.

print truncate["This is short string.", 25];

Ví dụ trên sẽ xuất ra:

This is short string.

37 hữu ích 2 bình luận chia sẻ

answer

9

Hãy nhớ rằng bất cứ khi nào bạn chia theo "từ" ở bất kỳ đâu mà một số ngôn ngữ như tiếng Trung và tiếng Nhật không sử dụng ký tự khoảng trắng để chia từ. Ngoài ra, người dùng độc hại có thể chỉ cần nhập văn bản mà không có bất kỳ khoảng trắng nào hoặc sử dụng một số Unicode trông giống với ký tự khoảng trắng tiêu chuẩn, trong trường hợp đó, bất kỳ giải pháp nào bạn sử dụng cũng có thể hiển thị toàn bộ văn bản. Một cách giải quyết vấn đề này có thể là kiểm tra độ dài chuỗi sau khi chia nhỏ trên khoảng trắng như bình thường, sau đó, nếu chuỗi vẫn vượt quá giới hạn bất thường - có thể là 225 ký tự trong trường hợp này - hãy tiếp tục và tách nó một cách ngu ngốc ở giới hạn đó.

Một lưu ý nữa với những thứ như thế này khi nói đến các ký tự không phải ASCII; các chuỗi chứa chúng có thể được hiểu theo chuẩn strlen [] của PHP là dài hơn thực tế, bởi vì một ký tự đơn lẻ có thể chiếm hai hoặc nhiều byte thay vì chỉ một. Nếu bạn chỉ sử dụng các hàm strlen [] / substr [] để chia chuỗi, bạn có thể tách một chuỗi ở giữa một ký tự! Khi nghi ngờ, mb_strlen [] / mb_substr [] dễ hiểu hơn một chút.

9 hữu ích 0 bình luận chia sẻ

answer

8

Sử dụng strpos và substr:


1 hữu ích 0 bình luận chia sẻ

answer

1

Đây là cách tôi đã làm điều đó:

$string = "I appreciate your service & idea to provide the branded toys at a fair rent price. This is really a wonderful to watch the kid not just playing with variety of toys but learning faster compare to the other kids who are not using the BooksandBeyond service. We wish you all the best";

print_r[substr[$string, 0, strpos[wordwrap[$string, 250], "\n"]]];

1 hữu ích 0 bình luận chia sẻ

answer

1

Mặc dù đây là một câu hỏi khá cũ, nhưng tôi nghĩ rằng tôi sẽ cung cấp một giải pháp thay thế, vì nó không được đề cập và hợp lệ cho PHP 4.3+.

Bạn có thể sử dụng nhóm sprintfhàm để cắt bớt văn bản, bằng cách sử dụng công cụ %.ℕssửa đổi độ chính xác.

Một dấu chấm .theo sau bởi một số nguyên, ý nghĩa của người phụ thuộc vào từ xác định:

  • Đối với các ký hiệu e, E, f và F: đây là số chữ số được in sau dấu thập phân [theo mặc định, đây là 6].
  • Đối với ký hiệu g và G: đây là số chữ số có nghĩa tối đa được in.
  • Đối với chỉ định của s: nó hoạt động như một điểm giới hạn, đặt giới hạn ký tự tối đa cho chuỗi

Cắt ngắn đơn giản //3v4l.org/QJDJU

$string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var_dump[sprintf['%.10s', $string]];

Kết quả

string[10] "0123456789"

Cắt bỏ mở rộng //3v4l.org/FCD21

Vì các sprintfchức năng tương tự như substrvà sẽ cắt bỏ một phần từ. Cách tiếp cận dưới đây sẽ đảm bảo các từ không bị cắt bằng cách sử dụng strpos[wordwrap[..., '[break]'], '[break]']dấu phân cách đặc biệt. Điều này cho phép chúng tôi truy xuất vị trí và đảm bảo chúng tôi không khớp trên cấu trúc câu tiêu chuẩn.

Trả lại một chuỗi mà không cắt bỏ một phần các từ và không vượt quá chiều rộng được chỉ định, trong khi vẫn giữ nguyên các dấu ngắt dòng nếu muốn.

function truncate[$string, $width, $on = '[break]'] {
    if [strlen[$string] > $width && false !== [$p = strpos[wordwrap[$string, $width, $on], $on]]] {
        $string = sprintf['%.'. $p . 's', $string];
    }
    return $string;
}
var_dump[truncate['0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', 20]];

var_dump[truncate["Lorem Ipsum is simply dummy text of the printing and typesetting industry.", 20]];

var_dump[truncate["Lorem Ipsum\nis simply dummy text of the printing and typesetting industry.", 20]];

Kết quả

/* 
string[36] "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"  
string[14] "Lorem Ipsum is" 
string[14] "Lorem Ipsum
is" 
*/

Kết quả bằng cách sử dụng wordwrap[$string, $width]hoặcstrtok[wordwrap[$string, $width], "\n"]

/*
string[14] "Lorem Ipsum is"
string[11] "Lorem Ipsum"
*/

1 hữu ích 0 bình luận chia sẻ

answer

1

Bạn có thể sử dụng cái này:

function word_shortener[$text, $words=10, $sp='...']{

  $all = explode[' ', $text];
  $str = '';
  $count = 1;

  foreach[$all as $key]{
    $str .= $key . [$count >= $words ? '' : ' '];
    $count++;
    if[$count > $words]{
      break;
    }
  }

  return $str . [count[$all]  $end]{ $pos_end = strrpos[substr[$str, 0, [$end + 1]], ' ']; } // IF STRING SIZE IS LESSER THAN END
    if[empty[$pos_end]]{ $pos_end = $end; } // FALLBACK
    return substr[$str, $pos_ini, $pos_end];
}

Ps: Chiều dài đầy đủ cắt có thể nhỏ hơn substr.

0 hữu ích 0 bình luận chia sẻ

answer

0

Đã thêm các câu lệnh IF / ELSEIF vào mã từ Dave và AmalMurali để xử lý các chuỗi không có dấu cách

if [[strpos[$string, ' '] !== false] && [strlen[$string] > 200]] { 
    $WidgetText = substr[$string, 0, strrpos[substr[$string, 0, 200], ' ']]; 
} 
elseif [strlen[$string] > 200] {
    $WidgetText = substr[$string, 0, 200];
}

0 hữu ích 0 bình luận chia sẻ

answer

0

Tôi thấy điều này hoạt động:

hàm viết tắt_string_to_whole_word [$ string, $ max_length, $ buffer] {

if [strlen[$string]>$max_length] {
    $string_cropped=substr[$string,0,$max_length-$buffer];
    $last_space=strrpos[$string_cropped, " "];
    if [$last_space>0] {
        $string_cropped=substr[$string_cropped,0,$last_space];
    }
    $abbreviated_string=$string_cropped." ...";
}
else {
    $abbreviated_string=$string;
}

return $abbreviated_string;

}

Bộ đệm cho phép bạn điều chỉnh độ dài của chuỗi trả về.

0 hữu ích 0 bình luận chia sẻ

answer

0

// a looonnng string ...
$str = "Le Lorem Ipsum est simplement du 
faux texte employé dans la composition et 
la mise en page avant impression. 
Le Lorem Ipsum est le faux texte standard de 
l'imprimerie depuis les années 1500, quand un 
imprimeur anonyme assembla ensemble des morceaux 
de texte pour réaliser un livre spécimen de polices
de texte. Il n'a pas fait que survivre cinq siècles,
mais s'est aussi adapté à la bureautique informatique,
sans que son contenu n'en soit modifié. Il a été 
popularisé dans les années 1960 grâce à la vente 
de feuilles Letraset contenant des passages du
Lorem Ipsum, et, plus récemment, par son inclusion 
dans des applications de mise en page de texte, 
comme Aldus PageMaker";
// number chars to cut
$number_to_cut = 300;
// string truncated in one line !
$truncated_string = 
substr[$str, 0, strrpos[substr[$str, 0, $number_to_cut], ' ']];
// test return
echo $truncated_string;

// variation [add ellipsis] : echo $truncated_string.' ...';

// output :
/* Le Lorem Ipsum est simplement du 
faux texte employé dans la composition et 
la mise en page avant impression. 
Le Lorem Ipsum est le faux texte standard de 
l'imprimerie depuis les années 1500, quand un 
imprimeur anonyme assembla ensemble des morceaux 
de texte pour réaliser un livre
*/

0 hữu ích 0 bình luận chia sẻ

answer

-1

Tôi đã sử dụng cái này trước đây


-1 hữu ích 0 bình luận chia sẻ

answer

-1

Ở đây bạn có thể thử cái này

substr[ $str, 0, strpos[$str, ' ', 200] ]; 

-1 hữu ích 1 bình luận chia sẻ

answer

-1

Tôi tin rằng đây là cách dễ nhất để làm điều đó:

$lines = explode['♦♣♠',wordwrap[$string, $length, '♦♣♠']];
$newstring = $lines[0] . ' • • •';

Tôi đang sử dụng các ký tự đặc biệt để tách văn bản và cắt nó.

-1 hữu ích 0 bình luận chia sẻ

answer

-1

Dùng cái này:

đoạn mã sau sẽ xóa ','. Nếu bạn có bất kỳ ký tự hoặc chuỗi con nào khác, bạn có thể sử dụng ký tự đó thay cho ','

substr[$string, 0, strrpos[substr[$string, 0, $comparingLength], ',']]

// nếu bạn có một tài khoản chuỗi khác cho

substr[$string, 0, strrpos[substr[$string, 0, $comparingLength-strlen[$currentString]], ',']]

-1 hữu ích 0 bình luận chia sẻ

answer

-2

Có thể điều này sẽ giúp ai đó:

Chủ Đề