2010-11-11 17 views
6

मैं है निम्न परीक्षण PHP कोड:अजीब पीएचपी UTF-8 व्यवहार

string(16) "Développeur Web" 
string(16) "Développeur-Web" 
string(16) "Développeur-Web" 
string(16) "D'eveloppeur-Web" 
string(16) "d'eveloppeur-web" 
string(15) "developpeur-web"

लेकिन मेरे लाइव सर्वर पर अजीब तरह से व्यवहार कर रहा है:

header('Content-type: text/html; charset=utf-8'); 

$text = 'Développeur Web'; 
var_dump($text); 

$text = preg_replace('#[^\\pL\d]+#u', '-', $text); 
var_dump($text); 

$text = trim($text, '-'); 
var_dump($text); 

$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); 
var_dump($text); 

$text = strtolower($text); 
var_dump($text); 

$text = preg_replace('#[^-\w]+#', '', $text); 
var_dump($text);

अपने स्थानीय मशीन पर यह अपेक्षा के अनुरूप काम कर रहा है

string 'Développeur Web' (length=16) 
string '-pp-' (length=4) 
string 'pp' (length=2) 
string 'pp' (length=2) 
string 'pp' (length=2) 
string 'pp' (length=2)

स्थानीय मशीन विंडोज चल रहा है PHP संस्करण 5.2.4 और लाइव सर्वर सेंटोस PHP संस्करण 5.2.10 चल रहा है वे किसी भी माध्यम से समान नहीं हैं, आदर्श नहीं मुझे पता है।

क्या किसी ने भी ऐसा कुछ अनुभव किया है और मुझे सही दिशा में इंगित कर सकता है? मुझे लगता है कि यह यूटीएफ -8 या लोकेल से संबंधित किसी प्रकार का सर्वर या PHP कॉन्फ़िगरेशन है।

अग्रिम

+0

अजीब। मैं Regexes के साथ महान नहीं हूँ - क्या आप बता सकते हैं कि पहले preg_replace() चीज़ क्या कर रही है? –

+0

मैंने शुरुआत में 'mb_default_encoding() 'के बारे में सोचा था, लेकिन उस लाइब्रेरी के पास' preg_ *' फ़ंक्शंस से कोई संबंध नहीं है। –

+0

पहली नियमित अभिव्यक्ति को गैर अक्षर या अंकों को प्रतिस्थापित करना चाहिए "-" यह सिम्फनी ट्यूटोरियल से आया है http://www.symfony-project.org/jobeet/1_4/Doctrine/en/08 –

उत्तर

2

में बहुत धन्यवाद नहीं यह

$text = preg_replace('#[^\pL\d]+#u', '-', $text); 

लाइन 6. में आप बच तो होना चाहिए \ आप एक शाब्दिक \ अपने बहिष्कार कक्षा में होगा। तो regex [^\\pL\d]+ एक चरित्र की एक या अधिक घटनाएं \, p, L या एक अंक नहीं है। यह समझाएगा कि क्यों "Développeur Web" को "-pp-" तक घटा दिया जाएगा - पहले p मैचों तक सब कुछ और - द्वारा प्रतिस्थापित किया जाएगा; दूसरे p के बाद सब कुछ के लिए भी यही सच है।

शायद \ से बचने के तरीके में दोनों मशीनों के बीच एक अंतर है।

संपादित ओपी टिप्पणी के बाद: - दोनों संस्करणों में उसी तरह व्यवहार कर रहे हैं

असल \ भागने यहाँ कोई समस्या नहीं है। वास्तव में समस्या यह नहीं है कि उपयोग किया गया पीसीआरई संस्करण यूनिकोड गुणों का समर्थन नहीं करता है और --enable-unicode-properties के साथ संकलित नहीं किया गया था।

+0

मैंने आपके द्वारा सुझाए गए पैटर्न को प्रतिस्थापित कर दिया है और मुझे अभी भी वांछित परिणाम नहीं मिल रहा है। –

+0

मैं इसे अपने आप में देख रहा हूं और सोचता हूं कि पीसीआरई के साथ ऐसा कुछ हो सकता है .. अभी भी देख रहे हैं। –

+0

pcretest -C पीसीआरई संस्करण 6।6 06-Feb-2006 साथ UTF-8 समर्थन संकलित कोई यूनिकोड गुणों का समर्थन newline वर्ण वामो है आंतरिक लिंक आकार = 2 POSIX malloc सीमा = 10 डिफ़ॉल्ट मैच सीमा = 10000000 डिफ़ॉल्ट प्रत्यावर्तन गहराई सीमा = 10000000 मैच रिकर्सन स्टैक –

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