Я пытаюсь написать достаточно разрешительный валидатор для имен в PHP, и моя первая попытка состоит из следующего шаблона:
// unicode letters, apostrophe, hyphen, space $namePattern = "/^([\\p{L}'\\- ])+$/";
Это в конечном итоге передается на вызов preg_match()
. Насколько я могу судить, это работает с вашим ванильным алфавитом ASCII, но, похоже, пытается напасть на более острые символы, такие как Ă или 张.
Что-то не так с самим шаблоном? Возможно, я ожидаю \p{L}
чтобы сделать больше работы, чем я думаю?
Или это имеет какое-то отношение к способу ввода данных? Я не уверен, что это актуально, но я обязательно указал кодировку UTF8 на странице формы.
Я думаю, что проблема намного проще: вы забыли указать модификатор u
. Свойства символа Юникода доступны только в режиме UTF-8 .
Ваше регулярное выражение должно быть:
// unicode letters, apostrophe, hyphen, space $namePattern = '/^[-\' \p{L}]+$/u';
Прежде всего, ваша жизнь будет намного проще, если вы будете использовать одиночные апострофы вместо двойных кавычек при написании их – вам нужна только одна обратная косая черта. Во-вторых, следует также включить сочетание меток \pM
. Если вы найдете символ, который не соответствует, пожалуйста, узнайте его код кода Unicode, а затем вы можете использовать http://www.fileformat.info/info/unicode/, чтобы выяснить, где он находится. Я нашел http://hsivonen.iki.fi/php-utf8/ бесценный инструмент при выполнении отладки с помощью свойств UTF-8 (не забудьте array_map('dechex', utf8ToUnicode($text))
конвертировать в шестнадцатеричный array_map('dechex', utf8ToUnicode($text))
: array_map('dechex', utf8ToUnicode($text))
).
Например, Ă оказывается http://www.fileformat.info/info/unicode/char/0102/index.htm и находиться в Лу, и поэтому L должен соответствовать ему, и он подходит для меня. Другой символ – http://www.fileformat.info/info/unicode/char/5f20/index.htm, а также isLetter и действительно подходит для меня. У вас есть таблицы символов Unicode, скомпилированные в?
Если вы хотите заменить old pattern
Unicode new pattern
вы должны написать:
$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
Итак, ключ здесь – модификатор u
Примечание . php version
вашего сервера php version
shoud должна быть не менее 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, и она работает
Важно знать, что этот метод очень полезен для арабских пользователей (عربي), потому что, как я считаю, unicode – лучший кодировщик для арабского языка, а замена не будет работать, если вы не используете модификатор u
, см. Следующий пример. должен работать с вами
$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);