2016-01-27 35 views
5

Tôi gặp khó khăn trong việc khớp hai chuỗi văn bản. Một chứa một số ký tự ẩn từ một chuỗi văn bản.Làm thế nào để loại bỏ các ký tự ẩn khỏi chuỗi văn bản trong PHP?

Tôi có chuỗi văn bản: "PR & Thông tin liên lạc" được lưu trữ trên cơ sở dữ liệu SQL. Khi được kéo từ đó, vào $database_version, var_dump($database_version) cho biết chuỗi có 19 byte.

Tôi đã cạo (với sự cho phép) từ một trang web, một số văn bản thành một biến, $web_version. Rõ ràng chuỗi là "PR & Truyền thông" nhưng không khớp với phiên bản cơ sở dữ liệu, tức là if($database_version == $web_version) là không đúng sự thật.

var_dump() tiết lộ $web_version để có 23 byte. trim() không có hiệu lực, cũng như không strip_tags() nhưng preg_replace('/[^\PC\s]/u', $web_version) xóa nội dung nào đó vì sau đó string_var($web_version) cho biết chuỗi chỉ bao gồm 14 byte. Nó đã loại bỏ rõ ràng một cái gì đó, có thể quá nhiều, vì chuỗi vẫn không khớp với $database_version.

Bất kỳ ý tưởng làm thế nào để:

  1. tìm hiểu những gì đã được gỡ bỏ
  2. dải ra vừa đủ để phù hợp với $ database_version?

PS Tôi không biết làm thế nào để xem các biến trong mã thập lục phân

+0

Wen cố gắng so sánh _if ($ database_version == $ web_version) _ là cả hai biến có định dạng chuỗi không? Hãy thử với một số phương pháp typecasting và trim. – Drone

+1

Bạn có thể thử sử dụng 'utf8-decode ($ web_version)' - http://php.net/manual/en/function.utf8-decode.php. – Scott

+1

gỡ lỗi: để xem chuỗi dưới dạng byte hex, sau đó sử dụng 'var_dump ($ web_version, bin2hex ($ web_version), __FILE __.__ LINE __);'. Để xem những gì nhân vật đại diện sau đó: [Bảng ASCII và mô tả] (http://www.asciitable.com/) và [Danh sách ký tự hoàn chỉnh cho UTF-8] (http://www.fileformat.info/info/charset /UTF-8/list.htm) –

Trả lời

2
$trimmedVal = preg_replace("/\s+|[[:^print:]]/, "", $value) 

trim() loại bỏ chỉ "\ t \ n \ r \ 0 \ x0B" (xem docs), do đó sử dụng đoạn mã ở trên để xóa các ký tự không được in khỏi chuỗi.

+0

điều này đã giúp tôi giải quyết một vấn đề hơi khác. Có lẽ bạn có thể làm rõ về các nhân vật không in và những gì regex này thực sự làm gì? –

+0

'[[: print:]]' là lớp ký tự in PCRE (bí danh cho regex phức tạp, nhiều hơn trong số chúng: http://php.net/manual/en/regexp.reference.character-classes.php) cú pháp. In ký tự có nghĩa là hiển thị trên trang kết xuất. Biểu tượng '^' bên trong lớp ký tự hoặc nhóm có nghĩa là phủ định, vì vậy '[[:^print:]]' có nghĩa là ký tự không in được - những ký tự không hiển thị sau khi hiển thị trang (ví dụ như BOM-mark). Các phần khác của regex rất dễ - '\ s' là viết tắt của" bất kỳ ký hiệu khoảng trống nào ", (dấu cách, tab, dòng mới, v.v.),' + 'có nghĩa là" lặp lại một hoặc nhiều lần ", ống (' | ') có nghĩa là "hoặc". –

+0

Vì vậy, toàn bộ, nó có thể được đọc là "tìm thấy bất kỳ biểu tượng không gian hoặc ký tự không thể in". –

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