PHP регулярное выражение не работает на моем сайте, но работает на редакторе регулярных выражений
моя цель
для "ввода имени автора", чтобы быть уверенным, что вводятся только пробелы и буквы utf-8. мой веб-сайт lang является турецким, турецкий алфавит имеет неанглийские символы.
моя странная проблема
это регулярное выражение работает на rubular.com
если входная строка: "Selim Çınar" результат: соответствует
если входная строка: "Selim Çınar 12" результат: не совпадает
регулярное выражение: /^[\p{L} ]+$/u
Затем я создал на своем сайте trial.php и запустил коды ниже
1
echo '<br /><br /><br />';
$str ='Selim Cinar';
if (!preg_match("/^[\p{L} ]+$/u", $str))
{echo 'no, not only utf-8 letters and spaces';}
else {$str.' yes utf-8 letters and spaces';}
echo '<br /><br /><br />';
результат для кода выше: пустая страница только с<br />
теги на исходной странице
2
echo '<br /><br /><br />';
$str ='Selim Çınar'; //includes Tr characters
if (!preg_match("/^[\p{L} ]+$/u", $str))
{echo 'no, not only utf-8 letters and spaces';}
else {$str.' yes utf-8 letters and spaces';}
echo '<br /><br /><br />';
результат для кода выше: пустая страница только с<br />
теги на исходной странице
3
источник кода: http://php.net/manual/en/function.ctype-alpha.php
$str ='Selim Çınar'; //includes Tr characters
$str =trim($str);
$str = str_replace(' ', '', $str);
setLocale(LC_CTYPE, 'TR_tr.UTF-8');
if (ctype_alpha($str)) {echo 'yes utf-8 letters';}
else {echo 'no, not only utf-8 letters';}
результат для кода выше: нет, не только UTF-8 букв
4
источник кода: http://php.net/manual/en/function.ctype-alpha.php
$str ='Selim Cinar';
$str =trim($str);
$str = str_replace(' ', '', $str);
setLocale(LC_CTYPE, 'TR_tr.UTF-8');
if (ctype_alpha($str)) {echo 'yes utf-8 letters';}
else {echo 'no, not only utf-8 letters';}
результат для кода выше: да UTF-8 букв
мой phpinfo
Версия PHP 5.4.10
Apache 2.0 Обработчик
Apache API версия: 20051115
Поддержка PCRE (регулярных выражений, совместимых с Perl)
Библиотека PCRE, версия 8.20 2011-10-21
о trial.php
trial.php - это чистый php. нет объявления заголовка HTML.
Мои вопросы
- почему я получаю пустую страницу для случая 1 и случая 2{!ОБНОВЛЕНИЕ: решено MikeM ниже}
- Почему случай 3 не понимает "Селимжинар" как utf-8? Является ли мой код ложным (
setLocale
часть может быть)?
ОБНОВИТЬ
вопрос 1 решается MikeM.
** вопрос 2 все еще существует как вопрос.
2 ответа
Не использовать setlocale
или же utf8_decode
Ваша проблема очень проста в том, что ваши исходные файлы php не сохраняются в UTF-8. Это зависит от вашего текстового редактора.
Вот что БУДЕТ работать, когда вы правильно сохранили файл:
$str = 'Selim Çınar'; //Since this is a string literal, its encoding is determined by
//how this source file was saved
if (preg_match("/^[\p{L} ]+$/u", $str)) {
echo 'yes only utf-8 letters or spaces';
} else {
echo 'no, not only utf-8 letters or spaces';
}
Вы получаете только пустую страницу для случаев 1 и 2, потому что регулярное выражение успешно соответствует $str
и, следовательно, else
ветвь выполнена, но нет echo
там так ничего не печатается.
Я не знаю ответа на ваш второй вопрос. setLocale
выглядит хорошо для меня, но его поведение зависит от системы.