Вопрос:

Соответствие букв Unicode в PCRE / PHP

php regex unicode pcre character-properties

9882 просмотра

3 ответа

634 Репутация автора

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

// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";

Это в конечном итоге передается вызов preg_match(). Насколько я могу судить, это работает с вашим ванильным алфавитом ASCII, но, кажется, запутывается от более острых символов, таких как Ă или 张.

Что-то не так с самим шаблоном? Возможно, я ожидаю \p{L}сделать больше работы, чем я думаю, что это делает?

Или это как-то связано со способом ввода? Я не уверен, что это уместно, но я обязательно указал кодировку UTF8 на странице формы.

Автор: Jeff Lee Источник Размещён: 13.02.2011 09:17

Ответы (3)


0 плюса

8745 Репутация автора

Прежде всего, ваша жизнь была бы намного проще, если бы вы использовали одинарные апострофы вместо двойных кавычек при их написании - вам нужен только один обратный слеш. Во-вторых, комбинирующие знаки \pMтакже должны быть включены. Если вы обнаружите, что символ не соответствует, выясните его кодовую точку Unicode, и затем вы можете использовать http://www.fileformat.info/info/unicode/, чтобы выяснить, где он находится. Я нашел http://hsivonen.iki.fi/php-utf8/ бесценный инструмент при отладке со свойствами UTF-8 (не забудьте преобразовать его в шестнадцатеричный формат, прежде чем искать:) array_map('dechex', utf8ToUnicode($text)).

Например, Ă оказывается http://www.fileformat.info/info/unicode/char/0102/index.htm и находится в Lu, и поэтому L должен соответствовать ему, и это подходит для меня. Другой персонаж - http://www.fileformat.info/info/unicode/char/5f20/index.htm, также isLetter и действительно мне подходит. У вас есть таблицы символов Unicode, скомпилированные в?

Автор: chx Размещён: 13.02.2011 09:27

26 плюса

84993 Репутация автора

Решение

Я думаю, что проблема гораздо проще: вы забыли указать u модификатор . Свойства символов Unicode доступны только в режиме UTF-8 .

Ваше регулярное выражение должно быть:

// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
Автор: NikiC Размещён: 13.02.2011 09:38

1 плюс

1476 Репутация автора

Если вы хотите заменить Unicode old patternна new patternвас, напишите:

$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);

Так что ключ здесь uмодификатор

Примечание : ваш сервер php versionдолжен быть хотя быPHP 4.3.5

как уже упоминалось здесь php.net | Модификаторы

u (PCRE_UTF8) Этот модификатор включает дополнительные функции PCRE, несовместимые с Perl. Строки шаблона рассматриваются как UTF-8. Этот модификатор доступен из PHP 4.1.0 или выше в Unix и из PHP 4.2.3 в win32. UTF-8 валидность шаблона проверяется начиная с PHP 4.3.5.

Спасибо, AgreeOrNotкто дал мне этот ключ preg_replace соответствует целое слово на арабском языке

Я попробовал это, и это сработало в localhost, но когда я попробовал это на удаленном сервере, это не сработало, тогда я обнаружил, что php.net начинает использовать uмодификатор в PHP 4.3.5. , Я обновляю версию php и она работает

Важно знать, что этот метод очень полезен для арабских пользователей (عربي), потому что - как я полагаю - юникод - лучшая кодировка для арабского языка, и замена не будет работать, если вы не используете uмодификатор, см. Следующий пример: работать с вами

$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);

Автор: usama sulaiman Размещён: 08.10.2013 09:42
Вопросы из категории :
32x32