2014-04-17 5 views
5

मेरे पास PHP में स्ट्रिंग हैं जो मैंने डेटाबेस से पढ़ी है। स्ट्रिंग यूआरएल हैं और पहली नज़र में वे अच्छे दिखते हैं, लेकिन अंत में कुछ अजीब चरित्र दिखते हैं। ब्राउज़र के पता बार में, '% E2% 80% 8E' स्ट्रिंग को यूआरएल में जोड़ा जाता है, जो यूआरएल को तोड़ देता है।PHP में स्ट्रिंग से अदृश्य वर्णों को निर्धारित करना और निकालना (% E2% 80% 8E)

मुझे this post on stripping the left-to-right-mark from a string in PHP मिला और यह मेरी समस्या से संबंधित प्रतीत होता है, लेकिन समाधान मेरे लिए काम नहीं करता है क्योंकि मेरे पात्र कुछ और प्रतीत होते हैं।

तो मैं यह निर्धारित कैसे कर सकता हूं कि मेरे पास कौन सा चरित्र है, इसलिए मैं इसे तारों से हटा सकता हूं?

(मैं एक उदाहरण के रूप यूआरएल यहाँ से एक पोस्ट है, लेकिन ढेर अतिप्रवाह प्रपत्र अंत में चरित्र स्ट्रिप्स के रूप में जल्द मैं यहाँ में पेस्ट के रूप में।)

मुझे पता है कि मैं केवल कुछ दे सकता है स्ट्रिंग में वर्ण और अन्य सभी को त्यागें। लेकिन मैं अभी भी जानना चाहूंगा कि यह कौन सा चार है - और यह डेटाबेस में कैसे हो जाता है।

संपादित करें: सवाल का जवाब दे दिया गया है और स्वीकार किए जाते हैं जवाब में दी गई कोड मेरे लिए काम करता है:

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

मैं उन्हें बाहर करने के लिए नियमित अभिव्यक्ति का प्रयोग करेंगे। देखें: http://www.roscripts.com/PHP_regular_expressions_examples-136.html –

+0

क्या आपने उपयोगकर्ता "समाधान" से समाधान का प्रयास किया था? –

+0

@CasimiretHippolyte धन्यवाद। उपयोगकर्ता द्वारा दिए गए preg_replace संस्करण जो आप मेरे लिए काम करते हैं, मैंने अभी कोशिश की है। लेकिन यह कौन सा char है? और स्वीकृत समाधान क्यों काम नहीं करता है अगर यह दाएं से बाएं निशान था? – spirit

उत्तर

12

इनपुट UTF8 एन्कोड, unicode regex उपयोग कर सकते हैं मैच के लिए e2808e की तरह/पट्टी अदृश्य नियंत्रण वर्ण है (बाएं से दाएं-चिह्न)। u (PCRE_UTF8)modifier और \p{C} या \p{Other} का उपयोग करें।

पट्टी बाहर सभी Invisibles:

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

\p{Other}


की Here is a list का पता लगाने/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>"; 
} 

आउटपुट:

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

Test on eval.in

, पहचान करने के लिए गूगल जैसे कम से ऊपर देखो fileformat.info:

@google: site:fileformat.info e2808e

+1

+1 अच्छा काम। <°))))))> –

+1

बहुत बहुत धन्यवाद, यह सवाल का जवाब है। Preg_replace काम करता है और दिए गए फ़ंक्शन को चरित्र को e2808e के रूप में पहचाना जाता है, जो सुझाए गए Google खोज शब्द के अनुसार - वास्तव में यूनिकोड कैरेक्टर 'बाएं-टू-राइट मार्क' (यू + 200 ई) है। मैंने यह जवाब स्वीकार कर लिया है। – spirit

संबंधित मुद्दे