Соответствие букв Unicode в PCRE/PHP
Я пытаюсь написать разумно допустимый валидатор для имен в PHP, и моя первая попытка состоит в следующем:
// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
Это в конечном итоге передается вызову preg_match()
, Насколько я могу судить, это работает с вашим ванильным алфавитом ASCII, но, кажется, запутывается от более острых символов, таких как Ă или 张.
Что-то не так с самим шаблоном? Возможно я ожидаю \p{L}
делать больше работы, чем я думаю?
Или это как-то связано со способом ввода? Я не уверен, что это актуально, но я обязательно указал кодировку UTF8 на странице формы.
3 ответа
Я думаю, что проблема гораздо проще: вы забыли указать u
модификатор Свойства символов Unicode доступны только в режиме UTF-8.
Ваше регулярное выражение должно быть:
// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
Если вы хотите заменить 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);
Прежде всего, ваша жизнь была бы намного проще, если бы вы использовали одинарные апострофы вместо двойных кавычек при их написании - вам нужен только один обратный слеш. Во-вторых, объединяя оценки \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, скомпилированные в?
Всем, кто смотрит сюда и не может заставить это работать, обратите внимание, что /u
не даст согласованного результата со сценариями Unicode в разных версиях PHP.
См. Пример: https://3v4l.org/4hB9e
Связанный: Непрерывный результат регулярного выражения для тайских символов в разных версиях PHP