2011-08-17 35 views
5

Tôi đã tìm thấy regex này trong tập lệnh tôi đang tùy chỉnh. Ai đó có thể cho tôi biết nó đang làm gì không?Regex này đang làm gì?

function test($text) { 
    $regex = '/([\x00-\x7F] | [\xC0-\xDF][\x80-\xBF] | [\xE0-\xEF][\x80-\xBF]{2} | [\xF0-\xF7][\x80-\xBF]{3}) | ./x'; 
    return preg_replace($regex, '$1', $text); 
} 
+1

Bạn không hiểu phần nào của nó? Bối cảnh là gì? –

+0

wooooah !! , regex của bạn đã cho tôi goosebumps :-) –

Trả lời

2

Bên trong nhóm chụp có bốn lựa chọn:

  1. [\x00-\x7F]
  2. [\xC0-\xDF][\x80-\xBF]
  3. [\xE0-\xEF][\x80-\xBF]{2}
  4. [\xF0-\xF7][\x80-\xBF]{3}

Nếu không có mẫu nào trong số các mẫu này được khớp tại một vị trí nhất định, thì bất kỳ ký tự nào sẽ được đối sánh bởi . nằm ngoài nhóm chụp.

Cuộc gọi preg_replace sẽ lặp lại trên $text tìm tất cả các trận đấu không trùng lặp, thay thế mỗi trận đấu với bất kỳ nội dung nào đã được chụp.

Có hai khả năng ở đây, toàn bộ kết hợp nằm trong nhóm chụp để thay thế không thay đổi $text hoặc . ở cuối khớp với một ký tự và ký tự đó bị xóa khỏi $text.

Dưới đây là một số ví dụ cơ bản:

  • Nếu một nhân vật trong phạm vi \xF8-\xFF xuất hiện trong văn bản, nó sẽ luôn luôn được gỡ bỏ
  • Một nhân vật trong \xC0-\xDF sẽ được loại bỏ trừ khi theo sau là một nhân vật trong \x80-\xBF
  • Một nhân vật trong \xE0-\xEF sẽ được loại bỏ trừ khi sau đó là hai nhân vật trong \x80-\xBF
  • Một nhân vật trong \xF0-\xF7 wil l được loại bỏ trừ khi theo sau là ba nhân vật trong \x80-\xBF
  • Một nhân vật trong \x80-\xBF sẽ được loại bỏ trừ khi nó được kết hợp như một phần của một trong những trường hợp nêu trên
1

Mục đích dường như là để "sạch" UTF- 8 văn bản được mã hóa. Phần trong nhóm chụp,

([\x00-\x7F] | [\xC0-\xDF][\x80-\xBF] | [\xE0-\xEF][\x80-\xBF]{2} | [\xF0-\xF7][\x80-\xBF]{3}) 

... gần khớp với chuỗi byte UTF-8 hợp lệ, có thể dài từ 1 đến 4 byte. Giá trị của byte đầu tiên xác định khoảng thời gian mà chuỗi byte cụ thể sẽ là.

Vì thay thế đơn giản là '$1', các chuỗi byte hợp lệ sẽ được cắm lại ngay vào đầu ra. Bất kỳ byte nào không khớp với phần đó sẽ được thay thế bằng dấu chấm (.) và bị xóa hiệu quả.

Điều quan trọng nhất cần biết về kỹ thuật này là bạn không bao giờ phải sử dụng nó. Nếu bạn tìm thấy các chuỗi byte UTF-8 không hợp lệ trong văn bản được mã hóa UTF-8 của bạn, nó có nghĩa là một trong hai điều: nó không thực sự là UTF-8, hoặc nó bị hỏng. Thay vì "làm sạch" nó, bạn nên tìm hiểu làm thế nào nó đã bẩn và sửa chữa rằng vấn đề.

+0

Mặc dù bạn là chính xác nó không phải luôn luôn có thể làm sạch đầu vào của bạn trước khi nó đạt đến PHP. Tôi vừa gặp phải vấn đề là đoạn mã trên giải quyết khi tôi sử dụng một công cụ bên ngoài để xử lý tệp Excel trả về dưới dạng chuỗi JSON. Khi thanh công cụ giải mã JSON PHP trên các ký tự không phải UTF, chúng cần được loại bỏ, mà mã ở trên thực hiện khá độc đáo. – Danack

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