2013-04-04 45 views
6

Tôi đang cố gắng sử dụng triển khai HTML Tidy là một phần của PHP (http://www.php.net/manual/en/book.tidy.php) để định dạng lại một đoạn lớn HTML. Tôi đang gặp một vấn đề trong đó Tidy cắt ngắn đầu ra qua một điểm nhất định (khoảng 8K).Tách HTML HTML: giới hạn kích thước cho bộ đệm

Khi tôi tạo ra một chuỗi đó là về 10K dài & tay nó để tidy_repair_string, như vậy:

$output = tidy_repair_string($output, array( 
    'indent' => true, // enforce indentation 
    'hide-comments' => true, // Remove the comments 
    'wrap' => 100, // Break each line after 100 chars 
    'output-html' => true, // Output as HTML 
    'char-encoding' => $encoding // The input/output encoding 
), $encoding); 

tôi lops tắt tất cả mọi thứ sau 8070 ký tự. Nếu tôi pad đầu của chuỗi với, nói rằng, 10 ký tự sau đó chính xác 10 ký tự còn lại tắt cuối. Có cách nào để thay đổi kích thước bộ đệm cho tidy_repair_string, để nó lớn hơn không?

Nhìn vào http://www.php.net/manual/en/tidy.getconfig.php dường như không có tùy chọn cấu hình cho nó, Google đáng chú ý không hữu ích/Google-fu của tôi đã thất bại và không có nhiều tài liệu về điều này. Mọi sự trợ giúp sẽ rất được trân trọng!

EDIT: Tôi đang sử dụng xampp-di-lite-win32-1.8.1-VC9 trên Windows 7. Vấn đề tiếp tục xảy ra ngay cả khi tôi thay đổi php.ini để sử dụng memory_limit = 900M

+0

có thể được lưu vào tệp và phân tích cú pháp tệp chứ không phải chuỗi? – StasGrin

Trả lời

1

Được rồi, tôi có thể nghĩ ra một vài lý do tại sao điều này có thể thất bại.

  1. Bạn đã vượt quá giới hạn bộ nhớ của bạn với không chỉ cuộc gọi chức năng này, nhưng tải biến vào bộ nhớ và bất kỳ pre-chế biến bạn đang làm. Để kiểm tra điều này, bạn có thể thử tăng giới hạn bộ nhớ của bạn trong php.ini lên một cái gì đó không cao, hoặc bạn có thể sử dụng memory_get_usage(). Chạy nó một lần trước khi tạo đối tượng của bạn, sau đó một lần nữa sau khi tạo đối tượng của bạn, và lấy sự khác biệt giữa hai kết quả. (How to find memory used by an object in PHP? (sizeof))

  2. Ngăn nắp PHP đang khởi động trên phiên bản chương trình gọn gàng của Linux. Tôi biết rằng một thời gian trở lại, chương trình đã có một giới hạn 4096 ký tự đưa vào nó cùng một lúc (http://www.autoitscript.com/forum/topic/129973-tidy-4096-char-limit/), nhưng có vẻ như là lỗi đó đã được sửa. Những gì tôi khuyên bạn nên chỉ để kiểm tra lý thuyết đó mặc dù là để echo ra chuỗi 10K của bạn (nó sẽ mất một phút) và sau đó chạy thẳng thông qua chương trình gọn gàng của bash. Tôi quyết định tự mình kiểm tra lý thuyết này:

    Từ BASH, echo $(python -c 'print 20000*"a"') > test_file. Vì char là 1 byte, nên lệnh này sẽ tạo một tệp cho chúng ta là 20K. Rõ ràng, điều này sẽ không hợp lệ với gọn gàng, nhưng đó là một số văn bản rác tốt đẹp mà tôi có thể ném vào chương trình. Bây giờ cho nó vào gọn gàng (Nếu bạn không có gọn gàng trên dòng lệnh, sudo apt-get install tidy) với tidy < test_file. Đối với tôi, điều này không thành công, nhưng có thể thử. Nếu nó không thất bại, sau đó nó không phải là cụ thể cho chương trình bash tidy bootstrapped.

    * Bây giờ, chúng tôi đã loại bỏ php.ini và chương trình bash gọn gàng thực tế là sự cố.

  3. Sau đó, tôi đã cố gắng tạo lại lỗi của bạn.

    Tôi bắt đầu sử dụng nhận xét từ trên cao, phân tích cú pháp tệp thay vì chuỗi.

    <?PHP 
    $output = tidy_repair_file("test_file"); 
    
    print strlen($output); 
    ?> 
    

    Đối với strlen tidy_repair_file, tôi có 20111 (nơi thêm 111 nhân vật đến từ định dạng gọn gàng. Không cắt ngắn. Sau đó, tôi đã cố gắng để đọc nó vào bộ nhớ hoạt động và phân tích nó như là một chuỗi.

    <?PHP 
    $data = readfile("test_file"); //read a 20K file into active memeory 
    
    $encoding = "ascii"; //I just set my encoding to 'ascii' because I like it... 
    
    $output = tidy_repair_string($data, array(
    'indent' => true, // enforce indentation 
    'hide-comments' => true, // Remove the comments 
    'wrap' => 100, // Break each line after 100 chars 
    'output-html' => true, // Output as HTML 
    'char-encoding' => $encoding // The input/output encoding 
    ), $encoding); 
    
    print strlen($output); 
    ?> 
    

Tôi rõ ràng là đang làm một cái gì đó sai ở đây, bởi vì tôi nhận được tập tin rác của tôi vang vọng trở lại với tôi, sau đó '132', mà là một tập tin HTML cơ bản:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"> 
<html> 
    <head> 
    <title></title> 
    </head> 
    <body> 
    20001 
    </body> 
</html> 

Trong khi tôi đang làm điều gì đó sai, đầu ra này cho tôi biết rằng tôi đang phân tích cú pháp tệp 20K mà không cắt xén.

Cũng đáng lưu ý rằng tôi đã thử mã này bằng cách sử dụng php test.php từ lời nhắc và chạy nó thông qua trình duyệt web. Tôi nhận được kết quả tương tự. Không cắt xén. Nó cũng đáng chú ý cho tôi để tiết lộ rằng tôi đang chạy này ra khỏi Ubuntu Server, không phải Windows IIS.

Hãy thử xuất biến của bạn thành tệp và sau đó chạy tidy_repair_file() dựa vào nó. Rõ ràng, giải pháp này không bền vững và sẽ không quy mô, nhưng nó sẽ thông báo cho bạn biết đó có phải là vấn đề với chuỗi gốc hay không.

Ngoài ra, hãy thử chạy strlen() trên $ output trước và sau cuộc gọi gọn gàng của bạn - đảm bảo rằng chuỗi của bạn là chuỗi 10K trước khi nó chạm vào gọn gàng ... giống như kiểm tra độ chính xác.

Chúc may mắn và tôi hy vọng một số điều này sẽ hữu ích!

+0

Thật tuyệt vời! Cảm ơn bạn một tấn cho trả lời chu đáo, chu đáo của bạn! (Tôi ước gì mình có thêm nhiều upvotes :)). Mã tôi đã sử dụng để kiểm tra sự cố là http://pastebin.com/fum84SpW. BướC# 1: Tôi đã thử thay đổi giới hạn bộ nhớ thành 900 MB, sử dụng memory_limit = 900M trong php.ini. Nó vẫn đang xảy ra. BướC# 2: Tôi không chắc chắn làm thế nào để chạy HTML gọn gàng từ dòng lệnh để nó sử dụng php_tidy.dll php sử dụng. BướC# 3: Bài đăng của bạn đã nhắc nhở tôi rằng có lẽ tôi nên chỉ định nền tảng tôi đang sử dụng - XAMPP trên Windows. Tôi sẽ đi sửa bài gốc để làm rõ điều đó. – MikeTheTall

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