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. почему я получаю пустую страницу для случая 1 и случая 2{!ОБНОВЛЕНИЕ: решено MikeM ниже}
  2. Почему случай 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 выглядит хорошо для меня, но его поведение зависит от системы.

Другие вопросы по тегам