10/10/2018, 09:25

Đọc nội dung từ file unicode trên server và trả về chuỗi có thể dùng preg_match được như thế nào?

Chào mọi người.

Mình có một file trên server save dưới dạng unicode, trong đó chứa các chữ tiếng Việt. Đuôi file có thể là *.txt hoặc *.tpl v.v.v. (tóm lại là dạng text).

Bây giờ mình muốn đọc nội dung trên vào một biến, sau đó dùng preg_match với biến này để lấy kết quả cần dùng. Tuy nhiên không được như ý muốn.

Ví dụ mình có file: needcontent.tpl
Code:
Mình có một file trên server save dưới dạng unicode, trong đó chứa các chữ tiếng Việt. Đuôi file có thể là *.txt hoặc *.file v.v.v. (tóm lại là dạng text).
01/11/2008
23/12/2007
Và nội dung cần lấy là các chuỗi định dạng ngày tháng 01/11/2008 23/12/2007

Mình đã dùng các cách:

PHP Code:
ob_start();
include 
"root/needcontent.tpl";
$contents ob_get_contents();
ob_clean();
preg_match_all('#d{2}/d{2}/d{4}#si'$contents$time);
print_r($time); 


PHP Code:
$handle fopen("root/needcontent.tpl"'r');
$contents fread($handlefilesize("root/needcontent.tpl"));
fclose($handle);
preg_match_all('#d{2}/d{2}/d{4}#si'$contents$time);
print_r($time); 

đều thất bại, kết quả trả về là trắng!
chưa thử với CURL.

Lưu ý:
+ Nếu thêm
PHP Code:
echo $contents
thì vẫn trả về toàn bộ nội dung của file needcontent.tpl

+ Preg pattern chuẩn, đã test với biến khai báo sẵn, ví dụ:
PHP Code:
$contents "For test 01/11/2008 23/12/2007"
Vui lòng giúp đỡ. Thanks
3do viết 11:34 ngày 10/10/2018
bác thay echo $contents bằng var_dump($contents) rồi xem lại kết quả nhé
BossFTP viết 11:32 ngày 10/10/2018
PHP Code:
<?php
$contents 
"Mình có một file trên server save dưới dạng unicode, trong đó chứa các chữ tiếng Việt. Đuôi file có thể là *.txt hoặc *.file v.v.v. (tóm lại là dạng text).
01/11/2008
23/12/2007"

preg_match_all('|***91;0-9***93;{2}/***91;0-9***93;{2}/***91;0-9***93;{2}|'$contents$time);
print_r($time);
?>
TheHeTre viết 11:42 ngày 10/10/2018
@BossFTP: Thay preg pattern không có kết quả khác. Bản chất \d cũng là [0-9]


Được gửi bởi 3do
bác thay echo $contents bằng var_dump($contents) rồi xem lại kết quả nhé
Nó ra như thế này.
Code:
string(222402) "��1�
�
�0�0�:�0�1�:�4�9�,�7�5�0� �-�-�>� �0�0�:�0�1�:�5�2�,�1�5�0�
�
�<�i�>�[�M�a�n�]�<�/�i�>�
�
�<�i�>�C���i� �c�h��t�.�<�/�i�>�
�
�
�
�2�
Vậy trong trường hợp của mình thì giải pháp như thế nào?
3do viết 11:27 ngày 10/10/2018
ob_clean() ko đúng vì chế độ buffer vẫn chưa được tắt, do đó print_r vẫn bị đẩy vào buffer

http://vn.php.net/manual/en/function.ob-end-clean.php

[=========> Bổ sung bài viết <=========]

Được gửi bởi TheHeTre
@BossFTP: Thay preg pattern không có kết quả khác. Bản chất \d cũng là [0-9]




Nó ra như thế này.
Code:
string(222402) "��1�
�
�0�0�:�0�1�:�4�9�,�7�5�0� �-�-�>� �0�0�:�0�1�:�5�2�,�1�5�0�
�
�<�i�>�[�M�a�n�]�<�/�i�>�
�
�<�i�>�C���i� �c�h��t�.�<�/�i�>�
�
�
�
�2�
Vậy trong trường hợp của mình thì giải pháp như thế nào?
không hiểu sao cái content của bác lại nhảy ra thế. Bác thử dùng file_get_contents xem sao
TheHeTre viết 11:39 ngày 10/10/2018
Đã thử dùng ob_end_clean() và thay thêm file_get_contents() cho 2 trường hợp vẫn chết. Không hiểu được
Mahakaruna viết 11:39 ngày 10/10/2018
Thử thêm switch "u" vào biểu thức xem
Code:
preg_match_all('#\d{2}/\d{2}/\d{4}#siu', $contents, $time);
TheHeTre viết 11:39 ngày 10/10/2018
@Mahakaruna: Mình dùng cách của bạn mà không được, vì nguyên nhân không nằm ở cái pattern

Các bạn chú ý dòng chữ đỏ nhé.
Mình có một file trên server save dưới dạng unicode, trong đó chứa các chữ tiếng Việt.
--> Nếu save dạng utf-8 thì bình thường, nhưng mình phải giải quyết vấn đề với file dạng UNICODE bình thường.
...

Để minh họa cụ thể hơn, các bạn load file này: http://coder.com.vn/ddth/try.txt về và đọc nội dung, tách ra được cụm ngày tháng cần thiết là 01/11/2008 và 23/12/2007 xem nhé.
hungbo viết 11:35 ngày 10/10/2018
load php extension php_mbstring
rồi dùng mb_convert_encoding
PHP Code:
$str file_get_contents('http://coder.com.vn/ddth/try.txt');
$str mb_convert_encoding($str"UTF-8""unicode");
preg_match_all('#\d{2}/\d{2}/\d{4}#si'$str$time);
print_r($time); 
kết quả:
Code:
Array ( [0] => Array ( [0] => 01/11/2008 [1] => 23/12/2007 ) )
đơn giản vãi =))
TheHeTre viết 11:39 ngày 10/10/2018
Cảm ơn @hungbo nhé. Đây chính là thuốc
PHP Code:
$str mb_convert_encoding($str"UTF-8""unicode"); 
Hehe. Chơi với mấy cái Encoding đau đầu gớm.

Hàm file_get_content tốn nhiều resource nên mình chuyển qua dùng như sau:
PHP Code:
//$contents = file_get_contents($fullFilepath);
$handle fopen($fullFilepath'r+b');
$contents fread($handlefilesize($fullFilepath));
fclose($handle);            
$contents mb_convert_encoding($contents"UTF-8""unicode");
//var_dump($contents);
preg_match_all('#\d{2}/\d{2}/\d{4}#si'$contents$time);
print_r($time); 

[=========> Bổ sung bài viết <=========]

Hiện tại đang test code do @web20 vn cung cấp từ PHPVietnam Group.
PHP Code:
<?php
$encoding 
'';
$handle fopen('http://coder.com.vn/ddth/try.txt''r');
if(
$handle) {
    
$bom_value fread($handle2);
    
rewind($handle);
    if(
$bom_value === chr(0xff).chr(0xfe) || $bom_value === chr(0xfe).chr(0xff)){
        
$encoding 'UTF-16';
    } else {
        
fread($handle1000) + 'e';
        
rewind($handle);
        
$encoding mb_detect_encoding(NULL'UCS-2, UTF-8, UTF-7, ASCII');
    }
    if (!empty(
$encoding)) {
        
stream_filter_append($handle'convert.iconv.'.$encoding.'/UTF-8');
    }
    while (!
feof($handle)) {}
    
fclose($handle);
}

echo 
$contents;
echo 
'<br />';
preg_match_all('#\d{2}/\d{2}/\d{4}#si'$contents$time);
print_r($time);
exit();
?>
Thanks for all support . Well done.
Bài liên quan
0