Как удалить диакритические знаки из текста?


Я создаю шведский веб-сайт, и шведские буквы - å, ä и ö.

Мне нужно сделать строку, введенную пользователем, безопасной для URL с помощью PHP.

В принципе, нужно преобразовать все символы в подчеркивание, все, КРОМЕ этих:

 A-Z, a-z, 1-9

И весь шведский язык должен быть преобразован следующим образом:

"å" до "a" и "ä" до "a" и "ö" до "o" (просто удалите точки выше).

Остальное должно стать подчеркиванием, как я уже сказал.

Я не очень хорош в обычных выражения, поэтому я был бы признателен за помощь, ребята!

Спасибо

ПРИМЕЧАНИЕ: НЕ URLENCODE... мне нужно сохранить его в базе данных... и т.д. и т.д., urlencode не будет работать для меня.

Author: George Claghorn, 2009-11-20

9 answers

// normalize data (remove accent marks) using PHP's *intl* extension
$data = normalizer_normalize($data);

// replace everything NOT in the sets you specified with an underscore
$data = preg_replace("#[^A-Za-z1-9]#","_", $data);
 13
Author: Jeremy L, 2015-02-05 00:12:49

Это должно быть полезно для обработки почти всех случаев.

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8'));
}
 18
Author: user1518659, 2012-10-12 09:14:25

Используйте iconv для преобразования строк из заданной кодировки в ASCII, затем замените не буквенно-цифровые символы с помощью preg_replace:

$input = 'räksmörgås och köttbullar'; // UTF8 encoded
$input = iconv('UTF-8', 'ASCII//TRANSLIT', $input);
$input = preg_replace('/[^a-zA-Z0-9]/', '_', $input);
echo $input;

Результат:

raksmorgas_och_kottbullar
 18
Author: Pär Wieslander, 2014-03-12 08:12:36

И весь шведский язык должен быть преобразован следующим образом:

"å" до "a" и "ä" до "a" и "ö" до "o" (просто удалите точки выше).

Использовать normalizer_normalize() чтобы избавиться от диакритических знаков.

Остальное должно стать подчеркиванием, как я уже сказал.

Использовать preg_replace() с шаблоном [\W] (т.е. w: любой символ, который не совпадает с буквами, цифрами или подчеркиванием), чтобы заменить их подчеркиванием.

Конечный результат должно выглядеть так:

$data = preg_replace('[\W]', '_', normalizer_normalize($data));
 7
Author: BalusC, 2009-11-20 13:12:29

Если вы просто заинтересованы в том, чтобы сделать URL-адрес безопасным, то вы хотите urlencode.

Возвращает строку, в которой все не буквенно-цифровые символы, кроме -_. были заменены процентом (%) знак, за которым следуют две шестнадцатеричные цифры и пробелы, закодированные как знаки плюс (+). Он кодируется так же, как кодируются опубликованные данные из формы WWW , то есть так же, как в типе носителя application/x-www-form-urlencoded . Это отличается от " RFC 1738 (RFC 1738) кодирование (см. rawurlencode()) в том, что по историческим причинам пространства кодируются как знаки плюс (+).

Если вы действительно хотите удалить все, кроме A-Z, a-z, 1-9 (кстати, что не так с 0?), то вы хотите:

$mynewstring = preg_replace('/[^A-Za-z1-9]/', '', $str);
 4
Author: Dominic Rodger, 2009-11-20 12:53:16

Так же просто, как

 $str = str_replace(array('å', 'ä', 'ö'), array('a', 'a', 'o'), $str); 
 $str = preg_replace('/[^a-z0-9]+/', '_', strtolower($str));

Предполагая, что вы используете одну и ту же кодировку для своих данных и своего кода.

 2
Author: user187291, 2009-11-20 13:03:06

Одним из простых решений является использование функции str_replace с поиском и заменой буквенных массивов.

 1
Author: Mihail Dimitrov, 2009-11-20 13:02:01

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

$your_URL = "www.mäåö.com";
$good_URL = strtr($your_URL, "äåöë etc...", "aaoe etc...");
echo $good_URL;

->вывод: www.maao.com :)

 0
Author: danii, 2009-11-20 13:02:59

Если включено расширение php intl, вы можете использовать транслитератор следующим образом:

protected function removeDiacritics($string)
{
    $transliterator = \Transliterator::create('NFD; [:Nonspacing Mark:] Remove; NFC;');
    return $transliterator->transliterate($string);
}

Для удаления других специальных символов (не только диакритических знаков, таких как "æ")

protected function removeDiacritics($string)
{
    $transliterator = \Transliterator::createFromRules(
        ':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;',
        \Transliterator::FORWARD
    );
    return $transliterator->transliterate($string);
}
 0
Author: dryobs, 2017-11-13 16:47:01