Как я удаляю диакритические знаки из символов в строке PHP?

Неважно, решил это. критически важно , чтобы ваш RealProxy производный класс вызывал базовый конструктор с проксируемым типом. В моем случае:

public class MyProxy<T> : RealProxy
{
    public MyProxy()
        : base(typeof(T))    // this was missing
    {
        ...
    }

    ...
}
81
задан Community 23 May 2017 в 12:18
поделиться

5 ответов

Я думаю, проблема здесь в том, что ваши кодировки рассматривают ä и å как разные символы по сравнению с 'a'. Фактически, документация PHP для strtr предлагает образец для удаления акцентов уродливым способом: (

http://ie2.php.net/strtr

5
ответ дан 24 November 2019 в 09:27
поделиться

Одна из уловок, на которую я наткнулся в Интернете, заключалась в использовании htmlentities с последующим удалением закодированного символа:

$stripped = preg_replace('`&[^;]+;`','',htmlentities($string));

Не идеально, но в некоторых case.

Но вы пишете о создании строки URL, поэтому urlencode и его аналог urldecode могут быть лучше. Или,

-1
ответ дан 24 November 2019 в 09:27
поделиться

Я согласен с комментарием Джорджброка.

Если вы найдете способ заставить // TRANSLIT работать, вы можете создать удобные URL-адреса:

  1. используйте iconv с // TRANSLIT ñ => п ~
    • удалить не буквенно-цифровые символы без пробелов внутри слов: $ url = preg_replace ('/ (\ w) [^ \ w \ s] (\ w) /', '$ 1 $ 2', $ url) ;
    • заменить оставшиеся разделения: $ url = preg_replace ('/ [^ a-z0-9] + /', '-', $ url);
    • удалить двойное / ведущее / переходное: $ url = preg_replace ('-' , например '/ (?: (^ | \ -) ​​\ - + | \ - $) /', '', $ url);

Если вы не можете заставить его работать, замените setp 1 заменой на основе strtr / символов, как решение Xetius.

2
ответ дан 24 November 2019 в 09:27
поделиться

Я не могу воспроизвести вашу проблему. Я получаю ожидаемый результат.

Как именно вы используете mb_detect_encoding () , чтобы убедиться, что ваша строка на самом деле является UTF-8?

Если я просто позвоню mb_detect_encoding ($ input) для версий вашей строки в кодировке UTF-8 и ISO-8859-1, оба возвращают «UTF-8», так что эта функция не особенно надежна.

iconv () дает мне "уведомление" PHP, когда он получает неверно закодированную строку и отображает только "F", но это может быть просто из-за разных настроек / версий PHP / iconv (?).

Я предлагаю вам попробовать позвонить mb_check_encoding ($ input, "utf-8") сначала убедитесь, что ваша строка действительно является UTF-8. Думаю, что нет.

2
ответ дан 24 November 2019 в 09:27
поделиться

Вы можете использовать urlencode. Не совсем выполняет то, что вы хотите (убирает акценты), но дает вам строку, пригодную для использования в URL

$output = urlencode ($input);

В Perl я мог бы использовать регулярное выражение для перевода, но я не могу вспомнить эквивалент PHP

$input =~ tr/áâàå/aaaa/;

и т. Д.

вы можете сделать это с помощью preg_replace

$patterns[0] = '/[á|â|à|å|ä]/';
$patterns[1] = '/[ð|é|ê|è|ë]/';
$patterns[2] = '/[í|î|ì|ï]/';
$patterns[3] = '/[ó|ô|ò|ø|õ|ö]/';
$patterns[4] = '/[ú|û|ù|ü]/';
$patterns[5] = '/æ/';
$patterns[6] = '/ç/';
$patterns[7] = '/ß/';
$replacements[0] = 'a';
$replacements[1] = 'e';
$replacements[2] = 'i';
$replacements[3] = 'o';
$replacements[4] = 'u';
$replacements[5] = 'ae';
$replacements[6] = 'c';
$replacements[7] = 'ss';

$output = preg_replace($patterns, $replacements, $input);

(обратите внимание, что это было набрано в пятницу после полудня, когда запомнилось туманное пиво, поэтому это может быть не на 100% правильным)

или вы можете создать хеш-таблицу и выполнить замену на основе это.

6
ответ дан 24 November 2019 в 09:27
поделиться
Другие вопросы по тегам:

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