Подтвердить что ты не робот

Преобразование специальных символов Microsoft Word в PHP

Я пытаюсь преобразовать текст Word, вставленный пользователями, которые содержат многоточие MS Word и длинную тире, прежде чем обрабатывать его дальше.

Я нашел здесь старое предлагаемое решение проблемы http://www.codingforums.com/archive/index.php/t-47163.html, но для меня это не сработало. Например, после замены многоточия переменная возвращается как пустая. Никогда не видел ничего подобного раньше:

$src = "Long word dash – and weird Word ellipsis…";
$src = str_replace("‘", "'", $src);
$src = str_replace("’", "'", $src);
$src = str_replace(""", '"', $src);
$src = str_replace(""", '"', $src);
$src = str_replace("–", "-", $src);
$src = str_replace("…", "...", $src);
print $src;

Любые идеи?

4b9b3361

Ответ 1

Для тех, кто получает знак вопроса о алмазе в PHP, этот метод замены символов UTF-8 работал лучше, чем использование функции chr.

$search = [                 // www.fileformat.info/info/unicode/<NUM>/ <NUM> = 2018
                "\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
                "\xE2\x80\x93", // – (U+2013) in UTF-8
                "\xE2\x80\x94", // — (U+2014) in UTF-8
                "\xE2\x80\xA6"  // … (U+2026) in UTF-8
    ];

    $replacements = [
                "<<", 
                ">>",
                "'",
                "'",
                "'",
                "'",
                '"',
                '"',
                '"',
                '"',
                "<",
                ">",
                "-",
                "-",
                "..."
    ];

    str_replace($search, $replacements, $string);

Ответ 2

Хм. Я использую эту функцию для дезинфекции текста, скопированного в RTE. В этом случае он может работать или не работать. Он преобразуется в объекты HTML, но вы можете настроить его, чтобы просто преобразовать в обычные символы:

function convertFromCP1252($string)
{
    $search = array('&',
                    '<',
                    '>',
                    '"',
                    chr(212),
                    chr(213),
                    chr(210),
                    chr(211),
                    chr(209),
                    chr(208),
                    chr(201),
                    chr(145),
                    chr(146),
                    chr(147),
                    chr(148),
                    chr(151),
                    chr(150),
                    chr(133),
                    chr(194)
                );

     $replace = array(  '&amp;',
                        '&lt;',
                        '&gt;',
                        '&quot;',
                        '&#8216;',
                        '&#8217;',
                        '&#8220;',
                        '&#8221;',
                        '&#8211;',
                        '&#8212;',
                        '&#8230;',
                        '&#8216;',
                        '&#8217;',
                        '&#8220;',
                        '&#8221;',
                        '&#8211;',
                        '&#8212;',
                        '&#8230;',
                        ''
                    );

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

Ответ 3

Отличное решение. Я скопировал и вставил его, и это сработало с проблемой. В ходе дальнейшего изучения я добавил несколько символов, которые не были найдены в массиве поиска и замены. Чтобы найти номера идентификаторов символов ASCII, я написал функцию PHP, которая показывает, что такое номер символа ASCII:

function stdump($s){

  for($i=0;$i<strlen($s);$i++){

    echo substr($s,$i,1) . "(" . ord(substr($s,$i,1)) . ")";

  }

  echo "<br/>";
}

Символ отображается, а рядом с ним число ascii отображается в скобках. Вот так:

echo stdump ( "GPUsâ € |" );

дает:

С (71) Р (80) и (85) с (115) A (226) € (128) | (166)

Надеюсь, что это поможет.

- Кит

Ответ 4

это работает для меня:

$str=file_get_contents($file); 

$array=array("‘"=>"'",""=>"'","'"=>'"',"'"=>'"',"–"=>"-","—"=>"-","–"=>"-","…"=>"...");

$str = strtr( $str,$array);

file_put_contents($file,$str);