Странное поведение регулярки

Emeron

Новичок
Вообщем, я не могу разобраться в странном поведении данной проверки имени юзера. Может, я плохо соображаю, но прошу помочь мне. Сам код:
PHP:
function checkName( $nick )
{
	$return = "Значение: {$nick}\n";
	
	if( !preg_match( "/^[A-Z|a-z|А-Я|а-я|0-9|_]+$/", $nick ) )
		$return .= "First: Неверное входящее значение\n";
	else
		$return .= "First: OK\n";

	if( !preg_match( "/^[A-Za-zА-Яа-я0-9_]+$/", $nick ) )
		$return .= "Second: Неверное входящее значение";
	else
		$return .= "Second: OK";
	
	return $return;
}

echo "Данная непонятка на PHP: ".phpversion()."\n\n";

echo checkName( 'А' )."\n\n";
echo checkName( 'Ад' )."\n\n";
echo checkName( 'Адми' )."\n\n";
echo checkName( 'Админи' )."\n\n";
echo checkName( 'Админист' )."\n\n";
echo checkName( 'Администратор' )."\n\n";
Вывел он следующее(что меня и поразило):
Данная непонятка на PHP: 5.2.6

Значение: А
First: OK
Second: OK

Значение: Ад
First: OK
Second: OK

Значение: Адми
First: OK
Second: OK

Значение: Админи
First: OK
Second: OK

Значение: Админист
First: Неверное входящее значение
Second: Неверное входящее значение

Значение: Администратор
First: Неверное входящее значение
Second: Неверное входящее значение
Вообщем, кому не сложно, помогите мне) Заранее, всем, кто просмотрел данный топик, спасибо.
 

Emeron

Новичок
И еще два момента, будет ли работать данный способ, если скрипт в utf8, но без BOM, либо в cp1251?
 

Вурдалак

Продвинутый новичок
Проблема в том, что в UTF-8 в общем случае 1 символ не равняется 1-му байту. BOM тут ни при чём. С cp1251 работать, естественно, не будет.
 

Emeron

Новичок
Ясно, ну огромное спасибо Вам! Помогли, да еще и на ночь глядя.
 
Сверху