Странное поведение ereg()

partizan

Новичок
Странное поведение ereg()

PHP:
echo ereg('^[a-zA-Z0-9_\.\-]+$','pasdasd-.22') ? 'TRUE' : 'FALSE';
-----------------------
TRUE

PHP:
echo ereg('^[a-zA-Z0-9_\-\.]+$','pasdasd-.22') ? 'TRUE' : 'FALSE';
-----------------------
FALSE

Почему так?
 
Символ минус '-' внутри класса используется для задания символьного диапазона. Например, [d-m] соответствует любому символу, находящемуся между 'd' и 'm', включая сами символы 'd' и 'm'. В случае, если '-' необходим, как член класса, он должен находиться в такой позиции, в которой он не может интерпретироваться как диапазон (как правило, это первый и последний символ описания класса) либо экранироваться при помощи обратного слеша.
 
Действительно не работает :) Не поверил - проверил. Почему, увы сказать не могу, самому интересно. Но с preg_match такого глюка не наблюдается, да и работает он быстрее. Есть подозрение, что это бага самого php. Да и разработчики вроде сами рекомендуют использовать именно perl-совместимые регулярные выражения и соотвествующие php функции.

З.Ы. Так получилось, что когда писал сообщение, ответа 440hz еще не было. И, символ '-' экранируется в обоих случаях слешом в приведенном выше коде. И его назначение что в POSIX регулярных выражениях и perl-выражениях вроде бы одинаково. Но при использовании preg_match все работает почему то нормально..
 
PHP:
<?
echo "\n".(ereg('^[a-zA-Z0-9_\.\-]+$','pasdasd-.22') ? 'TRUE' : 'FALSE');
echo "\n".(ereg('^[a-zA-Z0-9_\-\.]+$','pasdasd-.22') ? 'TRUE' : 'FALSE');
print "\n";
?>

мдя ... странно ... проверил и под 4 и под 5
 
Если это глюк, то пхпный. Если нет, то надо мануалить, что за ньюанс. *Ушел манить*
 
>Если это глюк, то пхпный.
ага, ведь это же PHP выполняет регэксп, никак не PCRELib.
 
Это не баг.
Этот случай обсуждали на php.net. Ман подтвердил, что ereg выполнялся правильно.
Вот ссылка на ман по pcre - http://www.tin.org/bin/man.cgi?section=7&topic=regex .
А вот ссылка на обсуждение проблемы - http://ua2.php.net/manual/ru/function.ereg.php#57387 .
 
Сверху