Как заменить закодированные Microsoft кавычки в PHP

Я должен заменить версию Microsoft Word единственных и двойных меток цитат (“ ” ‘ ’) с регулярными кавычками (' и") из-за кодирования выходят в моем приложении. Мне не нужны они, чтобы быть объектами HTML, и я не могу изменить свою схему базы данных.

У меня есть две опции: использовать или регулярное выражение или связанный массив.

Существует ли лучший способ сделать это?

68
задан Peter Mortensen 8 July 2019 в 15:05
поделиться

3 ответа

Учитывая, что вы хотите заменить только несколько конкретных и хорошо идентифицированных символов, я бы выбрал str_replace с массивом: вам, очевидно, не нужно регулярное выражение для тяжелой артиллерии. принести вам; -)

И если вы встретите какие-то другие специальные символы (чертовски копипаст из Microsoft Word ...), вы можете просто добавить их в этот массив, когда это необходимо / когда они будут идентифицированы.


лучший ответ, который я могу дать на ваш комментарий, вероятно, это ссылка: Преобразование умных котировок с помощью PHP

И связанный с ним код (цитируя эту страницу) :

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); 
} 

(у меня нет Microsoft Word на этом компьютере, поэтому я не могу проверить самостоятельно)

Я точно не помню, что мы использовали на работе (мне не приходилось иметь дело с таким вводом) ,но то же самое ...

86
ответ дан 24 November 2019 в 13:59
поделиться

Ваши кавычки, закодированные Microsoft , вероятно, типографические кавычки . Вы можете просто заменить их на str_replace , если вы знаете кодировку строки, в которой вы хотите их заменить.

Вот пример для UTF-8, но с использованием одного массива сопоставления с 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);

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

36
ответ дан 24 November 2019 в 13:59
поделиться

Мы использовали следующее. Он имеет дело с еще несколькими специальными символами.

$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');
5
ответ дан 24 November 2019 в 13:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: