перевод букв против специальных символов - PullRequest
0 голосов
/ 04 августа 2009

У меня есть набор данных, которые могут быть смешанными символами, специальными символами, символами «акцента» и т. Д.

Я использовал php inconv с транслитом, но сегодня заметил, что точка пули преобразуется в «бык». Я не знаю, какие еще символы не конвертируются и не удаляются. $, *,% и т. д. удаляются.

По сути, я пытаюсь сохранить буквы, но удалить только «неязыковые» биты.

Это код, который я использовал


        $slugIt = @iconv('UTF-8', 'ASCII//TRANSLIT', $slugIt);  

    $slugIt = preg_replace("/[^a-zA-Z0-9 -]/", "", $slugIt); 

Конечно, если я переместу preg_replace выше функции inconv, символы акцента будут удалены до их перевода, так что это тоже не сработает.

Есть идеи по этому поводу? или какие не буквенные символы пропущены в переводе?

--------------------- Edited ------------------------- -------- Как ни странно, это не ПЕРЕВОД, который меняет пулю на «бык». Я закомментировал preg-replace, и «бык» был возвращен к пуле. К сожалению, я пытаюсь использовать это для создания читаемых URL-адресов, а также для некоторых других вещей, поэтому мне все равно нужно будет делать URL-кодирование.

Ответы [ 3 ]

0 голосов
/ 04 августа 2009

вы можете попробовать использовать POSIX Regex:

$slugIt = ereg_replace('[^[:alnum:] -]', '', $slugIt);
$slugIt = @iconv('UTF-8', 'ASCII//TRANSLIT', $slugIt);

[: alnum:] будет соответствовать любому буквенно-цифровому символу (включая символы с акцентом).
Посмотрите на http://php.net/manual/en/book.regex.php для получения дополнительной информации о реализации POSIX в PHP.

0 голосов
/ 04 августа 2009

В итоге это оказалось комбинацией неправильного набора символов И того, как Windows обрабатывает inconv.

Прежде всего, у меня был набор символов iso-8859, и хотя я определял utf-8 в заголовке документа, php все еще рассматривал набор символов как ISO.

Во-вторых, при использовании iconv в Windows вы, очевидно, не можете комбинировать ASCII // TRANSLIT // IGNORE, что, к счастью, вы можете сделать в Windows.

Теперь в linux все акцентированные символы переводятся в их базовые символы, а не-буквенные цифры удаляются.

Вот новый код

  $slugIt = @iconv('iso-8859-1', 'ASCII//TRANSLIT//IGNORE', $slugIt);  
    $slugIt = preg_replace("/[^a-zA-Z0-9]/", "", $slugIt);  
0 голосов
/ 04 августа 2009

Попробуйте добавить модификатор / u в preg_replace. См. Модификаторы шаблонов

...