2012-04-14 26 views
30

मेरे पास php दस्तावेज़ signup.php है जो सामग्री को फॉर्म (form.php दस्तावेज़ में) से MySQL आधार पर सहेजता है। समस्या तब उत्पन्न होती है जब मैं इनपुट सामग्री को दोबारा सुधारना चाहता हूं। मैं यूटीएफ -8 charachters dec-> ए जैसे डीकोड करना चाहता हूँ।PHP विशेष वर्णों को बदलकर-- a, è-> e

$first_name=$_POST['first_name']; 
    $last_name=$_POST['last_name']; 
    $course=$_POST['course']; 

    $chain="prêt-à-porter"; 

$pattern = array("'é'", "'è'", "'ë'", "'ê'", "'É'", "'È'", "'Ë'", "'Ê'", "'á'", "'à'", "'ä'", "'â'", "'å'", "'Á'", "'À'", "'Ä'", "'Â'", "'Å'", "'ó'", "'ò'", "'ö'", "'ô'", "'Ó'", "'Ò'", "'Ö'", "'Ô'", "'í'", "'ì'", "'ï'", "'î'", "'Í'", "'Ì'", "'Ï'", "'Î'", "'ú'", "'ù'", "'ü'", "'û'", "'Ú'", "'Ù'", "'Ü'", "'Û'", "'ý'", "'ÿ'", "'Ý'", "'ø'", "'Ø'", "'œ'", "'Œ'", "'Æ'", "'ç'", "'Ç'"); 

$replace = array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'u', 'u', 'u', 'u', 'U', 'U', 'U', 'U', 'y', 'y', 'Y', 'o', 'O', 'a', 'A', 'A', 'c', 'C'); 

$chain = preg_replace($pattern, $replace, $chain); 

echo $chain; // print pret-a-porter 

$first_name = preg_replace($pattern, $replace, $first_name); 

echo $first_name; // does not change the input!?! 

ऐसा क्यों है $ श्रृंखला के लिए पूरी तरह से काम करता है, लेकिन $ first_name या $ last_name does not काम के लिए?

इसके अलावा मैं

echo $first_name; // print áááááábéééééébšššš 
$trans = array("á" => "a", "é" => "e", "š" => "s"); 
echo strtr("áááááábéééééébšššš", $trans); // print aaaaaabeeeeeebssss 
echo strtr($first_name,$trans); // print áááááábéééééébšššš 

कोशिश लेकिन समस्या यह है, जैसा कि आप देख सकते हैं, एक ही है!

+2

अपनी फ़ाइल सही एन्कोडिंग है? क्या $ _POST में सामान एक ही एन्कोडिंग है? (यानी आप जिस पेज को ब्राउज़र के साथ पेज प्रदर्शित करने के लिए सेट करते हैं?) आप preg_replace – phant0m

+1

के लिए यूनिकोड ध्वज भी सेट करना चाहते हैं क्योंकि phant0m उल्लेख है, आपको अपने सभी एन्कोडिंग पर नज़दीकी नजर रखने की आवश्यकता है। POST के साथ डिफ़ॉल्ट एन्कोडिंग आईएसओ -885 9 -1 है जबतक कि आप इसे विशेष रूप से बताएं जो आप चाहते हैं। (स्वीकृति-अक्षरसेट = 'यूटीएफ -8') – dmp

+0

ने कुछ उदाहरण कार्यों को जोड़ा :) – dmp

उत्तर

63

यह करने के लिए एक बहुत ही आसान तरीका, iconv का उपयोग कर नहीं है - उपयोगकर्ता नोटों से, यह क्या आप क्या करना चाहते हो रहा है: characters transliteration

// PHP.net User notes 
<?php 
    $string = "ʿABBĀSĀBĀD"; 

    echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $string); 
    // output: [nothing, and you get a notice] 

    echo iconv('UTF-8', 'ISO-8859-1//IGNORE', $string); 
    // output: ABBSBD 

    echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $string); 
    // output: ABBASABAD 
    // Yay! That's what I wanted! 
?> 

बनें बहुत ईमानदार अपने वर्ण एन्कोडिंग के साथ ऐसा है, आप प्रक्रिया में सभी चरणों में एक ही एन्कोडिंग रखते हैं - फ्रंट एंड, फॉर्म सबमिशन, स्रोत फ़ाइलों के एन्कोडिंग। PHP में डिफ़ॉल्ट रूप से एन्कोडिंग और रूपों में PHP 5.4 से पहले आईएसओ -885 9 -1 है, जहां यह यूटीएफ 8 (अंततः!) हो गया।

कुछ ऐसे फ़ंक्शन हैं जिन्हें आप विचारों के साथ खेल सकते हैं। कर सकते हैं see the source for inflector on github आप -

public static function slug($string, $replacement = '_') { 
    $quotedReplacement = preg_quote($replacement, '/'); 

    $merge = array(
     '/[^\s\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu' => ' ', 
     '/\\s+/' => $replacement, 
     sprintf('/^[%s]+|[%s]+$/', $quotedReplacement, $quotedReplacement) => '', 
    ); 

    $map = self::$_transliteration + $merge; 
    return preg_replace(array_keys($map), array_values($map), $string); 
} 

यह एक self::$_transliteration सरणी जो आप अपने प्रश्न में क्या कर रहे थे के समान है पर निर्भर करता है: सबसे पहले CakePHP के Inflector वर्ग, slug नाम से है।

दूसरा एक ऐसा कार्य है जिसका मैं व्यक्तिगत रूप से उपयोग करता हूं, जो comes from here है।

function slugify($text,$strict = false) { 
    $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8'); 
    // replace non letter or digits by - 
    $text = preg_replace('~[^\\pL\d.]+~u', '-', $text); 

    // trim 
    $text = trim($text, '-'); 
    setlocale(LC_CTYPE, 'en_GB.utf8'); 
    // transliterate 
    if (function_exists('iconv')) { 
     $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); 
    } 

    // lowercase 
    $text = strtolower($text); 
    // remove unwanted characters 
    $text = preg_replace('~[^-\w.]+~', '', $text); 
    if (empty($text)) { 
     return 'empty_$'; 
    } 
    if ($strict) { 
     $text = str_replace(".", "_", $text); 
    } 
    return $text; 
} 

क्या उन कार्यों कर लिप्यन्तरण और मनमाने ढंग से पाठ इनपुट, जो जब वेब क्षुधा बनाने अपने toolchest में है करने के लिए एक बहुत ही बहुत ही उपयोगी बात है से 'slugs' पैदा करते हैं। उम्मीद है की यह मदद करेगा!

+2

उत्तर के लिए धन्यवाद, समस्या यह थी कि मैंने फ़ॉर्म में "स्वीकार-वर्णसेट =" यूटीएफ -8 "" जोड़ा नहीं है। –

+0

आपका स्वागत है, मुझे लगता है कि उन सभी कार्यों की वास्तव में आवश्यकता नहीं थी :) लेकिन साथ ही एक नज़र भी ले सकते हैं। – dmp

+1

मैंने अपने फ़ंक्शन का उपयोग जारी रखा, क्योंकि इसके साथ मैं निश्चित रूप से निर्धारित कर सकता हूं कि मैं किस पत्र के साथ कुछ पत्र बदलूंगा। –

5

स्ट्रिंग $ श्रृंखला सरणी में वर्णों के समान वर्ण एन्कोडिंग में है - यह संभव है, यह भी संभव है कि $ first_name स्ट्रिंग एक अलग एन्कोडिंग में है, और इसलिए वे वर्ण मेल नहीं खाते हैं। आप इसके बजाय मल्टीबाइट स्ट्रिंग फ़ंक्शंस का उपयोग करने का प्रयास करना चाहेंगे।

mb_convert_encoding आज़माएं। आप HTML_ENTITIES को to_encoding पैरामीटर के रूप में उपयोग करने का भी प्रयास करना चाहेंगे, फिर आपको चिंता करने की आवश्यकता नहीं है कि वर्ण कैसे परिवर्तित किए जाएंगे - यह बहुत अनुमानित होगा।

इस स्क्रिप्ट को अपने इनपुट मान लिया जाये कि UTF-8 में, एक बुरी जगह शुरू करने के लिए नहीं है शायद ...

$first_name = mb_convert_encoding($first_name, "HTML-ENTITIES", "UTF-8"); 
+0

मैंने कोशिश की और यह नहीं है। echo $ first_name; // प्रिंट áááááábéééééééššššš $ first_name = mb_convert_encoding ($ first_name, "HTML-Entities", "UTF-8"); echo $ first_name; // print áááááábéééééééššššš –

+0

उत्तर के लिए धन्यवाद, समस्या यह थी कि मैंने फ़ॉर्म में "स्वीकार-वर्णसेट =" यूटीएफ -8 "" जोड़ा नहीं है। –

14

यहाँ खारिज कर दिया जाना चाहिए में कुछ लचीलापन होता है के लिए एक रास्ता है और क्या होना चाहिए जगह ले ली। इस प्रकार मैं वर्तमान में इसे करता हूं।

$ string = 'À जंक Ĩ Ä' के साथ कुछ स्ट्रिंग;

$replace = [ 
    '&lt;' => '', '&gt;' => '', '&#039;' => '', '&amp;' => '', 
    '&quot;' => '', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'Ae', 
    '&Auml;' => 'A', 'Å' => 'A', 'Ā' => 'A', 'Ą' => 'A', 'Ă' => 'A', 'Æ' => 'Ae', 
    'Ç' => 'C', 'Ć' => 'C', 'Č' => 'C', 'Ĉ' => 'C', 'Ċ' => 'C', 'Ď' => 'D', 'Đ' => 'D', 
    'Ð' => 'D', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ē' => 'E', 
    'Ę' => 'E', 'Ě' => 'E', 'Ĕ' => 'E', 'Ė' => 'E', 'Ĝ' => 'G', 'Ğ' => 'G', 
    'Ġ' => 'G', 'Ģ' => 'G', 'Ĥ' => 'H', 'Ħ' => 'H', 'Ì' => 'I', 'Í' => 'I', 
    'Î' => 'I', 'Ï' => 'I', 'Ī' => 'I', 'Ĩ' => 'I', 'Ĭ' => 'I', 'Į' => 'I', 
    'İ' => 'I', 'IJ' => 'IJ', 'Ĵ' => 'J', 'Ķ' => 'K', 'Ł' => 'K', 'Ľ' => 'K', 
    'Ĺ' => 'K', 'Ļ' => 'K', 'Ŀ' => 'K', 'Ñ' => 'N', 'Ń' => 'N', 'Ň' => 'N', 
    'Ņ' => 'N', 'Ŋ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 
    'Ö' => 'Oe', '&Ouml;' => 'Oe', 'Ø' => 'O', 'Ō' => 'O', 'Ő' => 'O', 'Ŏ' => 'O', 
    'Œ' => 'OE', 'Ŕ' => 'R', 'Ř' => 'R', 'Ŗ' => 'R', 'Ś' => 'S', 'Š' => 'S', 
    'Ş' => 'S', 'Ŝ' => 'S', 'Ș' => 'S', 'Ť' => 'T', 'Ţ' => 'T', 'Ŧ' => 'T', 
    'Ț' => 'T', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'Ue', 'Ū' => 'U', 
    '&Uuml;' => 'Ue', 'Ů' => 'U', 'Ű' => 'U', 'Ŭ' => 'U', 'Ũ' => 'U', 'Ų' => 'U', 
    'Ŵ' => 'W', 'Ý' => 'Y', 'Ŷ' => 'Y', 'Ÿ' => 'Y', 'Ź' => 'Z', 'Ž' => 'Z', 
    'Ż' => 'Z', 'Þ' => 'T', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 
    'ä' => 'ae', '&auml;' => 'ae', 'å' => 'a', 'ā' => 'a', 'ą' => 'a', 'ă' => 'a', 
    'æ' => 'ae', 'ç' => 'c', 'ć' => 'c', 'č' => 'c', 'ĉ' => 'c', 'ċ' => 'c', 
    'ď' => 'd', 'đ' => 'd', 'ð' => 'd', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 
    'ë' => 'e', 'ē' => 'e', 'ę' => 'e', 'ě' => 'e', 'ĕ' => 'e', 'ė' => 'e', 
    'ƒ' => 'f', 'ĝ' => 'g', 'ğ' => 'g', 'ġ' => 'g', 'ģ' => 'g', 'ĥ' => 'h', 
    'ħ' => 'h', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ī' => 'i', 
    'ĩ' => 'i', 'ĭ' => 'i', 'į' => 'i', 'ı' => 'i', 'ij' => 'ij', 'ĵ' => 'j', 
    'ķ' => 'k', 'ĸ' => 'k', 'ł' => 'l', 'ľ' => 'l', 'ĺ' => 'l', 'ļ' => 'l', 
    'ŀ' => 'l', 'ñ' => 'n', 'ń' => 'n', 'ň' => 'n', 'ņ' => 'n', 'ʼn' => 'n', 
    'ŋ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'oe', 
    '&ouml;' => 'oe', 'ø' => 'o', 'ō' => 'o', 'ő' => 'o', 'ŏ' => 'o', 'œ' => 'oe', 
    'ŕ' => 'r', 'ř' => 'r', 'ŗ' => 'r', 'š' => 's', 'ù' => 'u', 'ú' => 'u', 
    'û' => 'u', 'ü' => 'ue', 'ū' => 'u', '&uuml;' => 'ue', 'ů' => 'u', 'ű' => 'u', 
    'ŭ' => 'u', 'ũ' => 'u', 'ų' => 'u', 'ŵ' => 'w', 'ý' => 'y', 'ÿ' => 'y', 
    'ŷ' => 'y', 'ž' => 'z', 'ż' => 'z', 'ź' => 'z', 'þ' => 't', 'ß' => 'ss', 
    'ſ' => 'ss', 'ый' => 'iy', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 
    'Д' => 'D', 'Е' => 'E', 'Ё' => 'YO', 'Ж' => 'ZH', 'З' => 'Z', 'И' => 'I', 
    'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 
    'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 
    'Х' => 'H', 'Ц' => 'C', 'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'SCH', 'Ъ' => '', 
    'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'YU', 'Я' => 'YA', 'а' => 'a', 
    'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 
    'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 
    'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 
    'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 
    'ш' => 'sh', 'щ' => 'sch', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 
    'ю' => 'yu', 'я' => 'ya' 
]; 

echo str_replace(array_keys($replace), $replace, $string); 
3

विश मैं इस सूत्र जल्दी ही मिल गया।समारोह मैंने बनाया (कि मुझे जिस तरह से संभाल लिया है बहुत लंबा है) के नीचे है:

function CheckLetters($field){ 
    $letters = [ 
     0 => "a à á â ä æ ã å ā", 
     1 => "c ç ć č", 
     2 => "e é è ê ë ę ė ē", 
     3 => "i ī į í ì ï î", 
     4 => "l ł", 
     5 => "n ñ ń", 
     6 => "o ō ø œ õ ó ò ö ô", 
     7 => "s ß ś š", 
     8 => "u ū ú ù ü û", 
     9 => "w ŵ", 
     10 => "y ŷ ÿ", 
     11 => "z ź ž ż", 
    ]; 
    foreach ($letters as &$values){ 
     $newValue = substr($values, 0, 1); 
     $values = substr($values, 2, strlen($values)); 
     $values = explode(" ", $values); 
     foreach ($values as &$oldValue){ 
      while (strpos($field,$oldValue) !== false){ 
       $field = preg_replace("/" . $oldValue . '/', $newValue, $field, 1); 
      } 
     } 
    } 
    return $field; 
} 
+1

यह कोड का एक प्रतिभाशाली टुकड़ा है। विशेष रूप से असंगत डेटा वाले डेटाबेस खोजने के लिए। मैं इसे देश के डेटाबेस को खोजने के लिए उपयोग करता हूं जो उपयोगकर्ता द्वारा प्रदत्त डेटा से भरा हुआ है। यह वास्तव में गलत लिखित उपयोगकर्ता सामग्री जोड़ने में मदद करता है। मुझसे एक बड़ा अंगूठे ऊपर। –

+0

प्रतिक्रिया के लिए धन्यवाद। गलत रूप से दर्ज उपयोगकर्ता सामग्री ठीक है क्यों यह लिखा गया था :) – ChickenFeet

+0

बस एक sidenote, फ़ंक्शन की शुरुआत में अतिरिक्त प्रारंभिक ब्रेसिज़ को हटा दिया जाना चाहिए –

1

CodeIgniter रास्ता:

$this->load->helper('text'); 

$string = convert_accented_characters($string); 

यह कार्य करने के लिए और लिप्यंतरण के लिए सरणी से परिभाषित करने के लिए एक साथी कॉन्फ़िग फ़ाइल application/config/foreign_chars.php उपयोग करता है।

https://www.codeigniter.com/user_guide/helpers/text_helper.html#ascii_to_entities

+1

1- प्रश्न 2 साल पहले से पूछा गया था 2- प्रश्न का एक स्वीकार्य उत्तर है। 3- ओपी ने _CI फ्रेमवर्क_ का उल्लेख नहीं किया है और _plain php_ का उपयोग कर रहा है, इसलिए आपके उत्तर में प्रश्न के साथ कुछ लेना देना नहीं है। कृपया उत्तर देने से पहले प्रश्नों पर अधिक ध्यान दें – EhsanT

+0

इससे निराशा के दिन मुझे मदद मिली .. वास्तव में कोडिनेटर –

4

PHP के रूप में> = 5.4.0

$translatedString = transliterator_transliterate('Any-Latin; Latin-ASCII; [\u0080-\u7fff] remove', $string); 
+0

के लिए एक अच्छा जवाब एक आकर्षण की तरह काम करता है – brnmonteiro