как заменить специальные символы теми, они на основе в PHP?

Как делают я заменяю:

  • "ã" с "a"
  • "é" с "e"

в PHP? Действительно ли это возможно? Я читал где-нибудь, я мог сделать некоторую математику со значением ASCII основного символа и значением ASCII диакритического знака, но я не могу найти ссылки теперь.

16
задан Carlos 2 August 2012 в 16:35
поделиться

4 ответа

Этот ответ неверен. Я не понимал нормализации Unicode, когда писал ее. Посмотрите комментарий francadaval и ссылку

Для этого ознакомьтесь с классом Normalizer. Документация хороша, поэтому я просто свяжу ее, вместо того чтобы повторять здесь:

http://www.php.net/manual/en/class.normalizer.php

В частности, член normalize этого class:

http://www.php.net/manual/en/normalizer.normalize.php

Обратите внимание, что нормализация Unicode имеет несколько форм, и вы, похоже, хотите, чтобы форма нормализации KD (NFKD) Compatibility Decomposition, хотя вы должны прочитать документацию, чтобы убедиться.

Вы не должны пытаться использовать для этого свою собственную функцию: слишком много вещей могут пойти не так, и использование предоставленной функции - гораздо лучшая идея.

13
ответ дан 30 November 2019 в 15:21
поделиться

Люди часто используют str_replace или strtr и большой список символов для преобразования «из» и «в» - даже если это не так. Выглядит довольно красиво ...

Другое решение, я полагаю, могло бы использовать что-то вроде iconv с опцией // TRANSLIT - но не всегда работает, из что я помню ...

Кроме того, если вы используете PHP 5.3, новый класс Normalizer может быть интересен; -)

0
ответ дан 30 November 2019 в 15:21
поделиться

Если у вас нет доступа к классу нормализатора или вы просто не хотите его использовать, вы можете использовать следующую функцию для замены большинства (всех?) Распространенных акцентов.

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}
24
ответ дан 30 November 2019 в 15:21
поделиться

Особенно при сопоставлении текстов друг с другом или с ключевыми словами полезно предварительно нормализовать тексты. Следующая функция удаляет все диакритические знаки (отмечает акценты) из заданного текста в кодировке UTF8 и возвращает текст ASCii.

Убедитесь, что у вас установлено расширение PHP-Normalizer (intl и icu).

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

<?php

function normalizeUtf8String( $s)
{
    // Normalizer-class missing!
    if (! class_exists("Normalizer", $autoload = false))
        return $original_string;


    // maps German (umlauts) and other European characters onto two characters before just removing diacritics
    $s    = preg_replace( '@\x{00c4}@u'    , "AE",    $s );    // umlaut Ä => AE
    $s    = preg_replace( '@\x{00d6}@u'    , "OE",    $s );    // umlaut Ö => OE
    $s    = preg_replace( '@\x{00dc}@u'    , "UE",    $s );    // umlaut Ü => UE
    $s    = preg_replace( '@\x{00e4}@u'    , "ae",    $s );    // umlaut ä => ae
    $s    = preg_replace( '@\x{00f6}@u'    , "oe",    $s );    // umlaut ö => oe
    $s    = preg_replace( '@\x{00fc}@u'    , "ue",    $s );    // umlaut ü => ue
    $s    = preg_replace( '@\x{00f1}@u'    , "ny",    $s );    // ñ => ny
    $s    = preg_replace( '@\x{00ff}@u'    , "yu",    $s );    // ÿ => yu


    // maps special characters (characters with diacritics) on their base-character followed by the diacritical mark
        // exmaple:  Ú => U´,  á => a`
    $s    = Normalizer::normalize( $s, Normalizer::FORM_D );


    $s    = preg_replace( '@\pM@u'        , "",    $s );    // removes diacritics


    $s    = preg_replace( '@\x{00df}@u'    , "ss",    $s );    // maps German ß onto ss
    $s    = preg_replace( '@\x{00c6}@u'    , "AE",    $s );    // Æ => AE
    $s    = preg_replace( '@\x{00e6}@u'    , "ae",    $s );    // æ => ae
    $s    = preg_replace( '@\x{0132}@u'    , "IJ",    $s );    // ? => IJ
    $s    = preg_replace( '@\x{0133}@u'    , "ij",    $s );    // ? => ij
    $s    = preg_replace( '@\x{0152}@u'    , "OE",    $s );    // Π=> OE
    $s    = preg_replace( '@\x{0153}@u'    , "oe",    $s );    // œ => oe

    $s    = preg_replace( '@\x{00d0}@u'    , "D",    $s );    // Ð => D
    $s    = preg_replace( '@\x{0110}@u'    , "D",    $s );    // Ð => D
    $s    = preg_replace( '@\x{00f0}@u'    , "d",    $s );    // ð => d
    $s    = preg_replace( '@\x{0111}@u'    , "d",    $s );    // d => d
    $s    = preg_replace( '@\x{0126}@u'    , "H",    $s );    // H => H
    $s    = preg_replace( '@\x{0127}@u'    , "h",    $s );    // h => h
    $s    = preg_replace( '@\x{0131}@u'    , "i",    $s );    // i => i
    $s    = preg_replace( '@\x{0138}@u'    , "k",    $s );    // ? => k
    $s    = preg_replace( '@\x{013f}@u'    , "L",    $s );    // ? => L
    $s    = preg_replace( '@\x{0141}@u'    , "L",    $s );    // L => L
    $s    = preg_replace( '@\x{0140}@u'    , "l",    $s );    // ? => l
    $s    = preg_replace( '@\x{0142}@u'    , "l",    $s );    // l => l
    $s    = preg_replace( '@\x{014a}@u'    , "N",    $s );    // ? => N
    $s    = preg_replace( '@\x{0149}@u'    , "n",    $s );    // ? => n
    $s    = preg_replace( '@\x{014b}@u'    , "n",    $s );    // ? => n
    $s    = preg_replace( '@\x{00d8}@u'    , "O",    $s );    // Ø => O
    $s    = preg_replace( '@\x{00f8}@u'    , "o",    $s );    // ø => o
    $s    = preg_replace( '@\x{017f}@u'    , "s",    $s );    // ? => s
    $s    = preg_replace( '@\x{00de}@u'    , "T",    $s );    // Þ => T
    $s    = preg_replace( '@\x{0166}@u'    , "T",    $s );    // T => T
    $s    = preg_replace( '@\x{00fe}@u'    , "t",    $s );    // þ => t
    $s    = preg_replace( '@\x{0167}@u'    , "t",    $s );    // t => t

    // remove all non-ASCii characters
    $s    = preg_replace( '@[^\0-\x80]@u'    , "",    $s );


    // possible errors in UTF8-regular-expressions
    if (empty($s))
        return $original_string;
    else
        return $s;
}
?>

Вышеупомянутая функция в основном основана на следующей статье: http: // ahinea .com / en / tech / acnted-translate.html

1
ответ дан 30 November 2019 в 15:21
поделиться
Другие вопросы по тегам:

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