regex — совпадение букв Unicode в PCRE / переполнение стека

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

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

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

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

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

12

Решение

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

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

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

Другие решения

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

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

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

Заметка : Ваш сервер php version должно быть хотя бы PHP 4.3.5

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

ты (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);

1

Прежде всего, ваша жизнь была бы намного проще, если бы вы использовали одинарные апострофы вместо двойных кавычек при их написании — вам нужен только один обратный слеш. Во-вторых, объединяя оценки \pM также должны быть включены. Если вы обнаружите, что символ не соответствует, выясните его кодовую точку Unicode, а затем вы можете использовать http://www.fileformat.info/info/unicode/ выяснить, где это. я нашел http://hsivonen.iki.fi/php-utf8/ неоценимый инструмент при отладке со свойствами UTF-8 (не забудьте преобразовать в hex, прежде чем искать: 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, скомпилированные в?

0