2014-04-17 12 views
5

Tôi có các chuỗi trong PHP mà tôi đã đọc từ một cơ sở dữ liệu. Các chuỗi là các URL và ở cái nhìn đầu tiên họ nhìn tốt, nhưng dường như có một số ký tự kỳ lạ ở cuối. Trong thanh địa chỉ của trình duyệt, chuỗi '% E2% 80% 8E' được nối vào URL, URL này sẽ phá vỡ URL.Xác định và xóa các ký tự vô hình khỏi một chuỗi trong PHP (% E2% 80% 8E)

Tôi tìm thấy this post on stripping the left-to-right-mark from a string in PHP và dường như có liên quan đến vấn đề của tôi, nhưng giải pháp không hiệu quả đối với tôi vì các nhân vật của tôi dường như là thứ gì đó khác.

Vậy làm cách nào tôi có thể xác định ký tự nào tôi có để tôi có thể xóa ký tự đó khỏi chuỗi?

(Tôi sẽ gửi một trong những URL đây là một ví dụ, nhưng dưới hình thức stack overflow dải các nhân vật ở cuối ngay sau khi tôi dán nó ở đây.)

Tôi biết rằng tôi chỉ có thể cho phép một số ký tự trong chuỗi và loại bỏ tất cả các chuỗi khác. Nhưng tôi vẫn muốn biết nó là gì - và làm thế nào nó được đưa vào cơ sở dữ liệu.

EDIT: Câu hỏi đã được trả lời và mã đưa ra trong các câu trả lời được chấp nhận làm việc cho tôi:

$str = preg_replace('/\p{C}+/u', "", $str); 
+0

Tôi sẽ sử dụng cụm từ thông dụng để loại trừ chúng. Xem: http://www.roscripts.com/PHP_regular_expressions_examples-136.html –

+0

bạn đã thử giải pháp từ người dùng "BẠN" chưa? –

+0

@CasimiretHippolyte Cảm ơn. Các phiên bản preg_replace được đưa ra bởi người sử dụng bạn làm việc cho tôi, tôi chỉ cần thử nó. Nhưng char nào vậy? Và tại sao giải pháp được chấp nhận không hoạt động nếu đó là dấu từ phải sang trái? – spirit

Trả lời

12

Nếu đầu vào là utf8 mã hóa, có thể sử dụng unicode regex để phù hợp/dải ký tự điều khiển vô hình như e2808e (từ trái sang phải). Sử dụng u (PCRE_UTF8)modifier\p{C} hoặc \p{Other}.

Strip ra tất cả invisibles:

$str = preg_replace('/\p{C}+/u', "", $str); 

Here is a list của \p{Other}


Detect/xác định invisibles:

$str = ".\xE2\x80\x8E.\xE2\x80\x8B.\xE2\x80\x8F"; 

// get invisibles + offset 
if(preg_match_all('/\p{C}/u', $str, $out, PREG_OFFSET_CAPTURE)) 
{ 
    echo "<pre>\n"; 
    foreach($out[0] AS $k => $v) { 
    echo "detected ".bin2hex($v[0])." @ offset ".$v[1]."\n"; 
    } 
    echo "</pre>"; 
} 

đầu ra:

detected e2808e @ offset 1 
detected e2808b @ offset 5 
detected e2808f @ offset 9 

Test on eval.in

Để xác định, nhìn lên Google ví dụ fileformat.info:

@google: site:fileformat.info e2808e

+1

+1 Công việc tốt. <°))))))> –

+1

Cảm ơn rất nhiều, điều này trả lời câu hỏi. Các preg_replace hoạt động và chức năng được xác định các ký tự như e2808e, mà - theo thuật ngữ tìm kiếm google đề xuất - thực sự là ký tự Unicode 'LEFT-TO-RIGHT MARK' (U + 200E). Tôi đã chấp nhận câu trả lời này. – spirit

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