72 votes

Comment remplacer Microsoft-citations codées en PHP

J'ai besoin de remplacer Microsoft Word version de simples et doubles guillemets (" " ‘ ') avec régulièrement des guillemets ("et ") en raison d'un problème de codage de ma demande. Je n'ai pas besoin d'eux pour être en entités HTML et je ne peux pas modifier mon schéma de base de données.

J'ai deux options: soit utiliser une expression régulière ou un tableau.

Est-il une meilleure façon de le faire?

114voto

Justin Dominic Points 397

J'ai trouvé une réponse à cette question. Vous avez juste besoin d'une ligne de code à l'aide d' iconv() fonction en php:

// replace Microsoft Word version of single  and double quotations marks (" " ‘ ') with  regular quotes (' and ")
$output = iconv('UTF-8', 'ASCII//TRANSLIT', $input);     

89voto

Pascal MARTIN Points 195780

Considérant que vous ne voulez remplacer un peu spécifique et bien identifié, les caractères, je voudrais aller str_replace avec un tableau : manifestement, vous n'avez pas besoin de l'artillerie lourde de la regex va vous apporter ;-)

Et si vous rencontrez quelques autres caractères spéciaux (putain de copier-coller à partir de word...), vous pouvez simplement les ajouter à ce tableau à chaque fois que est nécessaire / à chaque fois qu'ils sont identifiés.


EDIT : la meilleure réponse que je peux donner à ton commentaire est probablement ce lien : Convertir les Guillemets avec PHP

Et le code associé (citant la page) :

function convert_smart_quotes($string) 
{ 
    $search = array(chr(145), 
                    chr(146), 
                    chr(147), 
                    chr(148), 
                    chr(151)); 

    $replace = array("'", 
                     "'", 
                     '"', 
                     '"', 
                     '-'); 

    return str_replace($search, $replace, $string); 
}

(Je n'ai pas de MS word sur cet ordinateur, donc je ne peux pas le tester par moi-même)

Je ne me souviens pas exactement de ce que nous avons utilisées au travail (je n'étais pas le seul d'avoir à traiter avec ce genre d'entrée), mais c'était le même genre de trucs...

39voto

Gumbo Points 279147

Votre Microsoft codé citations sont probablement le typographique des guillemets. Vous pouvez tout simplement les remplacer par str_replace si vous connaissez le codage de la chaîne que vous souhaitez remplacer.

Voici un exemple pour de l'UTF-8, mais à l'aide d'une simple cartographie de tableau avec strtr:

$quotes = array(
    "\xC2\xAB"     => '"', // « (U+00AB) in UTF-8
    "\xC2\xBB"     => '"', // » (U+00BB) in UTF-8
    "\xE2\x80\x98" => "'", // ‘ (U+2018) in UTF-8
    "\xE2\x80\x99" => "'", // ' (U+2019) in UTF-8
    "\xE2\x80\x9A" => "'", // ‚ (U+201A) in UTF-8
    "\xE2\x80\x9B" => "'", // ‛ (U+201B) in UTF-8
    "\xE2\x80\x9C" => '"', // " (U+201C) in UTF-8
    "\xE2\x80\x9D" => '"', // " (U+201D) in UTF-8
    "\xE2\x80\x9E" => '"', // „ (U+201E) in UTF-8
    "\xE2\x80\x9F" => '"', // ‟ (U+201F) in UTF-8
    "\xE2\x80\xB9" => "'", // ‹ (U+2039) in UTF-8
    "\xE2\x80\xBA" => "'", // › (U+203A) in UTF-8
);
$str = strtr($str, $quotes);

Si vous avez besoin d'un autre encodage, vous pouvez utiliser mb_convert_encoding pour convertir les touches.

11voto

thelastshadow Points 789

si comme moi vous arrivez ici avec une gamme énorme de cassé ascii / ms-word, caractères qui sont en train de faire bizarre choses de votre CMS ou RTE et iconv ne fonctionne pas, alors cette folle fonction est peut-être juste pour vous.

Assurez-vous que votre encodage est utf-8 lorsque vous enregistrez cette fonction dans un fichier.

<?php
/**
 * fixMSWord
 *
 * Replace ascii chars with utf8. Note there are ascii characters that don't 
 * correctly map and will be replaced by spaces.
 *
 * @author      Robin Cafolla
 * @date        2013-03-22
 * @Copyright   (c) 2013 Robin Cafolla
 * @licence     MIT (x11) http://opensource.org/licenses/MIT
 */
function fixMSWord($string) {
    $map = Array(
        '33' => '!', '34' => '"', '35' => '#', '36' => '$', '37' => '%', '38' => '&', '39' => "'", '40' => '(', '41' => ')', '42' => '*', 
        '43' => '+', '44' => ',', '45' => '-', '46' => '.', '47' => '/', '48' => '0', '49' => '1', '50' => '2', '51' => '3', '52' => '4', 
        '53' => '5', '54' => '6', '55' => '7', '56' => '8', '57' => '9', '58' => ':', '59' => ';', '60' => '<', '61' => '=', '62' => '>', 
        '63' => '?', '64' => '@', '65' => 'A', '66' => 'B', '67' => 'C', '68' => 'D', '69' => 'E', '70' => 'F', '71' => 'G', '72' => 'H', 
        '73' => 'I', '74' => 'J', '75' => 'K', '76' => 'L', '77' => 'M', '78' => 'N', '79' => 'O', '80' => 'P', '81' => 'Q', '82' => 'R', 
        '83' => 'S', '84' => 'T', '85' => 'U', '86' => 'V', '87' => 'W', '88' => 'X', '89' => 'Y', '90' => 'Z', '91' => '[', '92' => '\\', 
        '93' => ']', '94' => '^', '95' => '_', '96' => '`', '97' => 'a', '98' => 'b', '99' => 'c', '100'=> 'd', '101'=> 'e', '102'=> 'f', 
        '103'=> 'g', '104'=> 'h', '105'=> 'i', '106'=> 'j', '107'=> 'k', '108'=> 'l', '109'=> 'm', '110'=> 'n', '111'=> 'o', '112'=> 'p', 
        '113'=> 'q', '114'=> 'r', '115'=> 's', '116'=> 't', '117'=> 'u', '118'=> 'v', '119'=> 'w', '120'=> 'x', '121'=> 'y', '122'=> 'z', 
        '123'=> '{', '124'=> '|', '125'=> '}', '126'=> '~', '127'=> ' ', '128'=> '&#8364;', '129'=> ' ', '130'=> ',', '131'=> ' ', '132'=> '"', 
        '133'=> '.', '134'=> ' ', '135'=> ' ', '136'=> '^', '137'=> ' ', '138'=> ' ', '139'=> '<', '140'=> ' ', '141'=> ' ', '142'=> ' ', 
        '143'=> ' ', '144'=> ' ', '145'=> "'", '146'=> "'", '147'=> '"', '148'=> '"', '149'=> '.', '150'=> '-', '151'=> '-', '152'=> '~', 
        '153'=> ' ', '154'=> ' ', '155'=> '>', '156'=> ' ', '157'=> ' ', '158'=> ' ', '159'=> ' ', '160'=> ' ', '161'=> '¡', '162'=> '¢', 
        '163'=> '£', '164'=> '¤', '165'=> '¥', '166'=> '¦', '167'=> '§', '168'=> '¨', '169'=> '©', '170'=> 'ª', '171'=> '«', '172'=> '¬', 
        '173'=> '­', '174'=> '®', '175'=> '¯', '176'=> '°', '177'=> '±', '178'=> '²', '179'=> '³', '180'=> '´', '181'=> 'µ', '182'=> '¶', 
        '183'=> '·', '184'=> '¸', '185'=> '¹', '186'=> 'º', '187'=> '»', '188'=> '¼', '189'=> '½', '190'=> '¾', '191'=> '¿', '192'=> 'À', 
        '193'=> 'Á', '194'=> 'Â', '195'=> 'Ã', '196'=> 'Ä', '197'=> 'Å', '198'=> 'Æ', '199'=> 'Ç', '200'=> 'È', '201'=> 'É', '202'=> 'Ê', 
        '203'=> 'Ë', '204'=> 'Ì', '205'=> 'Í', '206'=> 'Î', '207'=> 'Ï', '208'=> 'Ð', '209'=> 'Ñ', '210'=> 'Ò', '211'=> 'Ó', '212'=> 'Ô', 
        '213'=> 'Õ', '214'=> 'Ö', '215'=> '×', '216'=> 'Ø', '217'=> 'Ù', '218'=> 'Ú', '219'=> 'Û', '220'=> 'Ü', '221'=> 'Ý', '222'=> 'Þ', 
        '223'=> 'ß', '224'=> 'à', '225'=> 'á', '226'=> 'â', '227'=> 'ã', '228'=> 'ä', '229'=> 'å', '230'=> 'æ', '231'=> 'ç', '232'=> 'è', 
        '233'=> 'é', '234'=> 'ê', '235'=> 'ë', '236'=> 'ì', '237'=> 'í', '238'=> 'î', '239'=> 'ï', '240'=> 'ð', '241'=> 'ñ', '242'=> 'ò', 
        '243'=> 'ó', '244'=> 'ô', '245'=> 'õ', '246'=> 'ö', '247'=> '÷', '248'=> 'ø', '249'=> 'ù', '250'=> 'ú', '251'=> 'û', '252'=> 'ü', 
        '253'=> 'ý', '254'=> 'þ', '255'=> 'ÿ'
    );

    $search = Array();
    $replace = Array();

    foreach ($map as $s => $r) {
        $search[] = chr((int)$s);
        $replace[] = $r;
    }

    return str_replace($search, $replace, $string); 
}

5voto

ceejayoz Points 85962

Nous avons utilisé le suivant. Traite avec un peu plus de caractères spéciaux.

$text = str_replace(chr(130), ',', $text);    // baseline single quote
$text = str_replace(chr(132), '"', $text);    // baseline double quote
$text = str_replace(chr(133), '...', $text);  // ellipsis
$text = str_replace(chr(145), "'", $text);    // left single quote
$text = str_replace(chr(146), "'", $text);    // right single quote
$text = str_replace(chr(147), '"', $text);    // left double quote
$text = str_replace(chr(148), '"', $text);    // right double quote

$text = mb_convert_encoding($text, 'HTML-ENTITIES', 'UTF-8');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X