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

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

Мне нужно сделать строку, введенную пользователем, чтобы стать url-безопасным с PHP.

в основном, нужно преобразовать все символы в подчеркивание, все, кроме этих:

 A-Z, a-z, 1-9

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

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

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

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

спасибо

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

9 ответов


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

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

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

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

$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

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

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

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

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

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

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

$data = preg_replace('[\W]', '_', normalizer_normalize($data));

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

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

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

$mynewstring = preg_replace('/[^A-Za-z1-9]/', '', $str);

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

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

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


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


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

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

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


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

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