2014-04-17 12 views
5

Veritabanından okuduğum PHP dizeleri var. Dizeler URL'lerdir ve ilk bakışta iyi görünüyorlar, ama sonunda garip bir karakter var gibi görünüyor. Tarayıcının adres çubuğunda, URL'yi kesen URL'ye '% E2% 80% 8E' dizesi eklenir.PHP'de bir dizgeden görünmeyen karakterleri belirleme ve kaldırma (% E2% 80% 8E)

this post on stripping the left-to-right-mark from a string in PHP'u buldum ve bu benim sorunumla ilgili görünüyor, ancak çözüm benim için çalışmıyor çünkü karakterlerim başka bir şey gibi görünüyor.

Peki, hangi karaktere sahip olduğumu nasıl belirleyebilirim böylece dizelerden kaldırabilirim?

(Ben burada örnek olarak URL'den birini göndermek, ama yığın taşması formu en kısa sürede buraya yapıştırın olarak sonunda karakterini ayıklar.)

Ben sadece belirli izin verebilir biliyoruz dize içinde chars ve diğer tüm atın. Ama hala hangi karakterin olduğunu ve veritabanına nasıl girildiğini bilmek isterim.

DÜZENLEME: Soru yanıtladı ve kabul edilen yanıt verilen kod benim için çalışıyor olmuştur:

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

Onları dışlamak için normal ifadeleri kullanırsınız. Bkz. Http://www.roscripts.com/PHP_regular_expressions_examples-136.html –

+0

"SİZ" kullanıcısından gelen çözümü denediniz mi? –

+0

@CasimiretHippolyte Teşekkürler. YOU kullanıcısı tarafından verilen preg_replace sürümü benim için çalışıyor, sadece denedim. Ama hangi char? Ve kabul edilen çözüm, sağdan sola işaretliyse neden işe yaramadı? – spirit

cevap

12

giriş utf8 kodlu, e2808e gibi/şerit görünmez kontrol karakterleri eşleştirmek için unicode regex kullanabilir ise (soldan sağa işareti). u (PCRE_UTF8)modifier ve \p{C} veya \p{Other} kullanın.

Şerit bütün görünmeyenler:

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

\p{Other}


arasında Here is a list Algılama/görünmeyenler tespit:

$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>"; 
} 

çıkışları:

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

Test on eval.in

, tespit Google'da örneğin bakarlar için fileformat.info:

@google: site:fileformat.info e2808e

+1

+1 İyi iş. <°))))))> –

+1

Çok teşekkürler, bu soruya cevap veriyor. Preg_replace çalışır ve verilen işlev e2808e karakterini tanımlar, bu da - önerilen google arama terimine göre - gerçekten Unicode Karakteri 'LEFT TO-RIGHT MARK' (U + 200E) 'dir. Bu cevabı kabul ettim. – spirit

İlgili konular