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

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

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

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

 A-Z, a-z, 1-9

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

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

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

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

Спасибо

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

Ответы

Ответ 1

// normalize data (remove accent marks) using PHP *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);

Ответ 2

Используйте 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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

Ответ 7

Одно простое решение - использовать str_replace с помощью поиска и замены массивов букв.

Ответ 8

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

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

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

Ответ 9

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

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