Есть ли способ превратить акцентированные символы в ближайший неакцентный аналог? - PullRequest
3 голосов
/ 10 февраля 2012

Мне нужно преобразовать URL-адрес, например "você-é-um-ás-da-aviação", в "voce-e-um-as-da-aviacao", чтобы сделать его удобным для чтения в поисковой выдаче.

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

Возможно ли это? это жизнеспособно?

Ответы [ 4 ]

3 голосов
/ 10 февраля 2012
function url_safe($string){
    $url = $string;
    setlocale(LC_ALL, 'fr_FR'); // change to the one of your language
    $url = iconv("UTF-8", "ASCII//TRANSLIT", $url);  
    $url = preg_replace('~[^\\pL0-9_]+~u', '-', $url);
    $url = trim($url, "-");
    $url = strtolower($url);
    return $url;
    }
2 голосов
/ 10 февраля 2012

Вы можете использовать каноническое отображение декомпозиции, предоставляемое фондом Unicode (файлы в http://www.unicode.org/Public/UNIDATA/).

Однако, это не так просто, как кажется, - верьте в этоили нет, существует символ «ккал», каноническая декомпозиция которого имеет длину четыре символа.

Вы также можете обратиться к таблицам числовых эквивалентов, поскольку «обведенное число семь», вероятно, должно соответствовать цифре ASCII.семь и т. д.

Однако я настоятельно советую не использовать эту стратегию - вы вырезаете свой текст для небольшой выгоды и не можете восстановить исходный ввод, как только вы его преобразовали.

0 голосов
/ 10 февраля 2012

Вы можете использовать комбинацию iconv, чтобы получить вашу строку как ASCII, а затем preg_replace, чтобы удалить ненужные символы.

Что-то вроде:

$string = "você-é-um-ás-da-aviação";
$collated = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
$filtred = preg_replace('`[^-a-zA-Z0-9]`', '', $collated);
echo $filtred;
0 голосов
/ 10 февраля 2012

Я предлагаю вам сопоставить каждый специальный символ и его замену в массив, а затем заменить текст регулярным выражением.
Я знаю, что вы заявили, что не хотите использовать обычную замену , но это единственный жизнеспособный способ сделать это. Вы можете отфильтровать их (проверив, находится ли их код ascii в определенном диапазоне), но это не то же самое для правильной замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...