2012-12-20 41 views
6

Với substr() bạn có thể bỏ qua các tham số thứ ba để có được toàn bộ phần còn lại của chuỗi:Nhận phần còn lại của chuỗi đến cuối với mb_substr() và vẫn thiết lập mã hóa

substr('abcdefg', 2) // returns "cdefg" 

Bạn không thể làm tương tự với mb_substr():

mb_substr('abcdefg', 2, null, 'UTF-8'); // returns empty string 

Tôi chỉ tìm thấy các giải pháp kỳ lạ và xấu xí.

  • Thiết lập một số lượng rất cao như chiều dài:

    $a = mb_substr('abcdefg', 2, 9999999999, 'UTF-8');

  • Tính số:

    $a = mb_substr('abcdefg', 2, mb_strlen('abcdefg', 'UTF-8') - 2, 'UTF-8');

  • Bỏ tham số charset bằng cách sử dụng mb_internal_encoding():

    012 không có

    $temp = mb_internal_encoding(); // prevent action at a distance
    mb_internal_encoding('UTF-8');
    $a = mb_substr('abcdefg', 2);
    mb_internal_encoding($temp);

Là một giải pháp thực tế?

+0

Không hiểu tại sao 'mb_substr ('abcdefg', 2, null, 'UTF-8')' không thực hiện những gì bạn muốn trong các tình huống mà bạn được yêu cầu cung cấp đối số tùy chọn (mã hóa) cuối cùng. – ficuscr

+0

@ficuscr, bởi vì điều đó không xuất ra bất cứ điều gì: http://sandbox.onlinephpfunctions.com/code/407e2a6c7d00f7002054a069fef3ca510061c747 –

+1

http://codepad.viper-7.com/KZ33rR – ficuscr

Trả lời

2

Nhật ký thay đổi hiển thị điều này dưới dạng sửa lỗi trong Phiên bản 5.4.8 (18-tháng 10 năm 2012).

http://us.php.net/ChangeLog-5.php

Cho phép đi qua null như một giá trị mặc định để mb_substr() và mb_strcut(). Bản vá của Alexander Moskaliov qua GitHub PR # 133.

Dưới đây là một liên kết đến kéo theo yêu cầu chủ đề cũng: https://github.com/php/php-src/pull/133

+0

Bạn có chắc 'mb_substr ('abcdefg', 2, -1, 'UTF-8');' cung cấp cho bạn "cdefg" trong PHP 5.2.17 chứ không phải "cdef"? – AndreKR

+0

@AndreKR bạn là chính xác. Đó là thiết lập lại khi tôi đăng lại biểu mẫu. Tôi nghĩ rằng tôi sẽ đào lên thông tin đăng nhập php.net của tôi và thử và nhận được một cảnh báo trước được đăng trên trang đó, trong các ý kiến ​​nếu không có nơi nào khác. Ngạc nhiên tôi đã không bị đốt cháy bởi điều này được nêu ra với tất cả các mã PHP cũ tôi thấy. – ficuscr

2

Đây là một sự khác biệt giữa PHP 5.3 (và có lẽ cũng trong các phiên bản trước đó) và PHP 5.4.

Thực ra, bạn có thể thấy vấn đề trong mã nguồn của PHP nếu bạn tò mò.

Đây là tệp ext/mbstring/mbstring.c có sự khác biệt sau trong hàm PHP_FUNCTION(mb_substr).

Trong PHP 5.3 họ kiểm tra cho tình trạng này:

if (argc < 3) { 
    len = str_len; 
} 

Trong khi đó PHP 5.4 họ sử dụng:

if (argc < 3 || Z_TYPE_PP(z_len) == IS_NULL) { 
    len = str_len; 
} 

Bạn có thể tìm những định nghĩa trong việc thực hiện các mb_string chức năng được bắt đầu bằng PHP_FUNCTION(mb_substr) trong tệp được đề cập. Mã nguồn có thể được tải xuống từ php.net download page.

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